In [293]:
import warnings
warnings.filterwarnings('ignore')
import pandas as pd #library for data manipulation and analysis
import numpy as np #library used for working with arrays
import matplotlib.pyplot as plt #library for plots and visualizations
import seaborn as sns #library for visualizations
from scipy.stats import norm #using normal distibutions
from scipy.stats import zscore




# to create k folds of data and get cross validation score
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score

# Import Linear Regression machine learning library
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso

from sklearn.metrics import r2_score

# To oversample and undersample data
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler

###Heirarchical CLustering and PCA
from sklearn.cluster import AgglomerativeClustering 
from scipy.cluster.hierarchy import cophenet, dendrogram, linkage
from scipy.spatial.distance import pdist  #Pairwise distribution between data points
from sklearn.decomposition import PCA
from scipy.stats import zscore



#Deeplearning

import pandas as pd
import numpy as np
import keras
from tensorflow.keras.utils import to_categorical
import warnings
warnings.filterwarnings('ignore')
from tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau


# import torch
# import torchvision
# import numpy as np
# import matplotlib
# import matplotlib.pyplot as plt
# import torch.nn as nn
# import torch.nn.functional as F
# from torchvision.datasets import MNIST
# from torchvision.transforms import ToTensor
# from torchvision.utils import make_grid
# from torch.utils.data.dataloader import DataLoader
# from torch.utils.data import random_split
# %matplotlib inline
# # Use a white background for matplotlib figures
# matplotlib.rcParams['figure.facecolor'] = '#ffffff'




#Neural Networks
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn import model_selection
from sklearn.compose import ColumnTransformer
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.impute import SimpleImputer
import warnings
from sklearn.metrics import confusion_matrix
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import RandomizedSearchCV
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dense, Input, Dropout,BatchNormalization
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier
import random
from tensorflow.keras import backend
random.seed(1)
np.random.seed(1) 
tf.random.set_seed(1)
warnings.filterwarnings("ignore")




%matplotlib inline

pd.set_option('display.float_format', lambda x: '%.2f' % x) # To supress numerical display in scientific notations


import scipy.stats #library contains a number of probibility distributions and statistical functions

df = pd.read_csv('Churn.csv')



df.head()
Out[293]:
RowNumber CustomerId Surname CreditScore Geography Gender Age Tenure Balance NumOfProducts HasCrCard IsActiveMember EstimatedSalary Exited
0 1 15634602 Hargrave 619 France Female 42 2 0.00 1 1 1 101348.88 1
1 2 15647311 Hill 608 Spain Female 41 1 83807.86 1 0 1 112542.58 0
2 3 15619304 Onio 502 France Female 42 8 159660.80 3 1 0 113931.57 1
3 4 15701354 Boni 699 France Female 39 1 0.00 2 0 0 93826.63 0
4 5 15737888 Mitchell 850 Spain Female 43 2 125510.82 1 1 1 79084.10 0

Objective:¶

To understand why customers leave the bank, and possibly make recomendations on how to keep current customers.

Data Dictionary¶

CustomerId: Unique ID which is assigned to each customer

Surname: Last name of the customer

CreditScore: It defines the credit history of the customer.

Geography: A customer’s location

Gender: It defines the Gender of the customer

Age: Age of the customer

Tenure: Number of years for which the customer has been with the bank

NumOfProducts: It refers to the number of products that a customer has purchased through the bank.

Balance: Account balance

HasCrCard: It is a categorical variable that decides whether the customer has a credit card or not.

EstimatedSalary: Estimated salary

isActiveMember: It is a categorical variable that decides whether the customer is an active member of the bank or not ( Active member in the sense, using bank products regularly, making transactions, etc )

Exited: It is a categorical variable that decides whether the customer left the bank within six months or not. It can take two values

                0=No ( Customer did not leave the bank )

                1=Yes ( Customer left the bank )
In [141]:
df.isnull().sum().sort_values(ascending=False)
Out[141]:
RowNumber          0
CustomerId         0
Surname            0
CreditScore        0
Geography          0
Gender             0
Age                0
Tenure             0
Balance            0
NumOfProducts      0
HasCrCard          0
IsActiveMember     0
EstimatedSalary    0
Exited             0
dtype: int64
In [59]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10000 entries, 0 to 9999
Data columns (total 14 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   RowNumber        10000 non-null  int64  
 1   CustomerId       10000 non-null  int64  
 2   Surname          10000 non-null  object 
 3   CreditScore      10000 non-null  int64  
 4   Geography        10000 non-null  object 
 5   Gender           10000 non-null  object 
 6   Age              10000 non-null  int64  
 7   Tenure           10000 non-null  int64  
 8   Balance          10000 non-null  float64
 9   NumOfProducts    10000 non-null  int64  
 10  HasCrCard        10000 non-null  int64  
 11  IsActiveMember   10000 non-null  int64  
 12  EstimatedSalary  10000 non-null  float64
 13  Exited           10000 non-null  int64  
dtypes: float64(2), int64(9), object(3)
memory usage: 1.1+ MB
In [294]:
df.drop(['RowNumber'], axis=1, inplace=True)
df.drop(['CustomerId'], axis=1, inplace=True)
df.drop(['Surname'], axis=1, inplace=True)

df.head()
Out[294]:
CreditScore Geography Gender Age Tenure Balance NumOfProducts HasCrCard IsActiveMember EstimatedSalary Exited
0 619 France Female 42 2 0.00 1 1 1 101348.88 1
1 608 Spain Female 41 1 83807.86 1 0 1 112542.58 0
2 502 France Female 42 8 159660.80 3 1 0 113931.57 1
3 699 France Female 39 1 0.00 2 0 0 93826.63 0
4 850 Spain Female 43 2 125510.82 1 1 1 79084.10 0
In [61]:
df.Geography.unique()
Out[61]:
array(['France', 'Spain', 'Germany'], dtype=object)
In [62]:
df.Gender.unique()
Out[62]:
array(['Female', 'Male'], dtype=object)
In [63]:
#################################CHECK DUPLICATES
#check for duplicated rows
df.duplicated().sum()
Out[63]:
0
In [295]:
#below redefining buckets for each case
# replaceStruct = {

#                 "Geography": {"France": 1, "Spain":2 , "Germany": 3},
#                 "Gender":     {"Female": 1, "Male": 0 }
#                    }
oneHotCols=["Geography","Gender"]


#reassign the values in the dataframe

# df=df.replace(replaceStruct)
df=pd.get_dummies(df, columns=oneHotCols)
df.head(10)
Out[295]:
CreditScore Age Tenure Balance NumOfProducts HasCrCard IsActiveMember EstimatedSalary Exited Geography_France Geography_Germany Geography_Spain Gender_Female Gender_Male
0 619 42 2 0.00 1 1 1 101348.88 1 1 0 0 1 0
1 608 41 1 83807.86 1 0 1 112542.58 0 0 0 1 1 0
2 502 42 8 159660.80 3 1 0 113931.57 1 1 0 0 1 0
3 699 39 1 0.00 2 0 0 93826.63 0 1 0 0 1 0
4 850 43 2 125510.82 1 1 1 79084.10 0 0 0 1 1 0
5 645 44 8 113755.78 2 1 0 149756.71 1 0 0 1 0 1
6 822 50 7 0.00 2 1 1 10062.80 0 1 0 0 0 1
7 376 29 4 115046.74 4 1 0 119346.88 1 0 1 0 1 0
8 501 44 4 142051.07 2 0 1 74940.50 0 1 0 0 0 1
9 684 27 2 134603.88 1 1 1 71725.73 0 1 0 0 0 1
In [65]:
df.Tenure.unique()
Out[65]:
array([ 2,  1,  8,  7,  4,  6,  3, 10,  5,  9,  0])
In [66]:
df.loc[df['Tenure'],'Tenure'].value_counts(dropna=False)
Out[66]:
2    2386
8    2060
4    2053
1    2044
7     967
6     490
Name: Tenure, dtype: int64
In [67]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10000 entries, 0 to 9999
Data columns (total 11 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   CreditScore      10000 non-null  int64  
 1   Geography        10000 non-null  int64  
 2   Gender           10000 non-null  int64  
 3   Age              10000 non-null  int64  
 4   Tenure           10000 non-null  int64  
 5   Balance          10000 non-null  float64
 6   NumOfProducts    10000 non-null  int64  
 7   HasCrCard        10000 non-null  int64  
 8   IsActiveMember   10000 non-null  int64  
 9   EstimatedSalary  10000 non-null  float64
 10  Exited           10000 non-null  int64  
dtypes: float64(2), int64(9)
memory usage: 859.5 KB
In [156]:
####################################MAKE A LIST OF NON OBJECT COLUMN NAMES

#Box plot function

# Defining the function for creating boxplot and hisogram 
def histogram_boxplot(data, feature, figsize=(12, 7), kde=False, bins=None):
    """
    Boxplot and histogram combined

    data: dataframe
    feature: dataframe column
    figsize: size of figure (default (12,7))
    kde: whether to show the density curve (default False)
    bins: number of bins for histogram (default None)
    """
    f2, (ax_box2, ax_hist2) = plt.subplots(
        nrows=2,  # Number of rows of the subplot grid= 2
        sharex=True,  # x-axis will be shared among all subplots
        gridspec_kw={"height_ratios": (0.25, 0.75)},
        figsize=figsize)  # creating the 2 subplots
    
    sns.boxplot(data=data, x=feature, ax=ax_box2, showmeans=True, color="mediumturquoise")  # boxplot will be created and a star will indicate the mean value of the column
    
    if bins:
      sns.histplot(data=data, x=feature, kde=kde, ax=ax_hist2, bins=bins, color="mediumpurple")
    else: 
      sns.histplot(data=data, x=feature, kde=kde, ax=ax_hist2, color="mediumpurple")  # For histogram
    
    ax_hist2.axvline(data[feature].mean(), color="green", linestyle="--")  # Add mean to the histogram
    
    ax_hist2.axvline(data[feature].median(), color="black", linestyle="-")  # Add median to the histogram


#########################

columns_list = []

for i in df.columns:
    if df.dtypes[i]!=object:
        columns_list.append(i)

for i in columns_list:
    histogram_boxplot(df,i)  #you can't use this part without the defined functions

Notes¶

  1. Age is going to have to be bucketed into bins. I want to look at outilers for the Age column because the data looks right skewed.
  2. Balance is also going to have to be binned also there seems to be an outlier for 0. value that is causing the data to be bimodal
  3. Number of Products also seems to be right skewed so I will look at that last.
  4. Estimated Salary is also going to need to be binned.
In [296]:
#################################OUTLIER TEST

# outlier detection using boxplot - UNIVARIATE FIRST
# selecting the numerical columns of data and adding their names in a list 
numeric_columns = columns_list
plt.figure(figsize=(15, 12))

for i, variable in enumerate(numeric_columns):
    plt.subplot(4, 4, i + 1)
    plt.boxplot(df[variable], whis=1.5)
    plt.tight_layout()
    plt.title(variable)

plt.show()


#IQR

# to find the 25th percentile and 75th percentile for the numerical columns.
Q1 = df[numeric_columns].quantile(0.25)
Q3 = df[numeric_columns].quantile(0.75)

IQR = Q3 - Q1                   #Inter Quantile Range (75th percentile - 25th percentile)

lower_whisker = Q1 - 1.5*IQR    #Finding lower and upper bounds for all values. All values outside these bounds are outliers
upper_whisker = Q3 + 1.5*IQR

# Percentage of outliers in each column
((df[numeric_columns] < lower_whisker) | (df[numeric_columns] > upper_whisker)).sum()/df.shape[0]*100
Out[296]:
CreditScore          0.15
Age                  3.59
Tenure               0.00
Balance              0.00
NumOfProducts        0.60
HasCrCard            0.00
IsActiveMember       0.00
EstimatedSalary      0.00
Exited              20.37
Geography_France     0.00
Geography_Germany    0.00
Geography_Spain     24.77
Gender_Female        0.00
Gender_Male          0.00
dtype: float64
In [146]:
df.loc[df['NumOfProducts'],'NumOfProducts'].value_counts(dropna=False)
Out[146]:
1    5144
3    4590
2     266
Name: NumOfProducts, dtype: int64
In [297]:
####################################TREATING OUTLIERS

#IQR

def treat_outliers(df, col):
    """
    treats outliers in a variable
    col: str, name of the numerical variable
    df: dataframe
    col: name of the column
    """
    Q1 = df[col].quantile(0.25)  # 25th quantile
    Q3 = df[col].quantile(0.75)  # 75th quantile
    IQR = Q3 - Q1                # Inter Quantile Range (75th perentile - 25th percentile)
    lower_whisker = Q1 - 1.5 * IQR
    upper_whisker = Q3 + 1.5 * IQR

    # all the values smaller than lower_whisker will be assigned the value of lower_whisker
    # all the values greater than upper_whisker will be assigned the value of upper_whisker
    # the assignment will be done by using the clip function of NumPy
    df[col] = np.clip(df[col], lower_whisker, upper_whisker)

    return df

#check the outliers

#Treating outliers in Rooms column

df = treat_outliers(df,'Age')
df = treat_outliers(df,'CreditScore')
#df = treat_outliers(df,'NumOfProducts')

# visualizing the column after outlier treatment
# outlier detection using boxplot
# selecting the numerical columns where outliers were treated 

plt.figure(figsize=(15, 12))

for i, variable in enumerate(numeric_columns):
    plt.subplot(4, 4, i + 1)
    plt.boxplot(df[variable], whis=1.5)
    plt.tight_layout()
    plt.title(variable)

plt.show()
In [299]:
sns.histplot(data=df,x='EstimatedSalary',stat='density')
plt.show()
In [301]:
sns.histplot(data=df,x='Balance',stat='density')
plt.show()
In [302]:
df = df[df['Balance']>0] 
In [303]:
sns.histplot(data=df,x='Balance',stat='density')
plt.show()
In [306]:
df['Balance_range'] = pd.qcut(df['Balance'], q=4)
df['EstimatedSalary_range'] = pd.qcut(df['EstimatedSalary'], q=5)
In [309]:
df.head()
Out[309]:
CreditScore Age Tenure Balance NumOfProducts HasCrCard IsActiveMember EstimatedSalary Exited Geography_France Geography_Germany Geography_Spain Gender_Female Gender_Male Balance_label EstimatedSalary_label Balance_range EstimatedSalary_range
1 608 41 1 83807.86 1 0 1 112542.58 0 0 0 1 1 0 1 3 (3768.689, 100181.975] (80414.646, 120377.52]
2 502 42 8 159660.80 3 1 0 113931.57 1 1 0 0 1 0 4 3 (139512.29, 250898.09] (80414.646, 120377.52]
4 850 43 2 125510.82 1 1 1 79084.10 0 0 0 1 1 0 3 2 (119839.69, 139512.29] (41818.154, 80414.646]
5 645 44 8 113755.78 2 1 0 149756.71 1 0 0 1 0 1 2 4 (100181.975, 119839.69] (120377.52, 160494.082]
7 383 29 4 115046.74 4 1 0 119346.88 1 0 1 0 1 0 2 3 (100181.975, 119839.69] (80414.646, 120377.52]
In [311]:
df.EstimatedSalary_range.unique()
Out[311]:
[(80414.646, 120377.52], (41818.154, 80414.646], (120377.52, 160494.082], (11.579, 41818.154], (160494.082, 199970.74]]
Categories (5, interval[float64, right]): [(11.579, 41818.154] < (41818.154, 80414.646] < (80414.646, 120377.52] < (120377.52, 160494.082] < (160494.082, 199970.74]]
In [312]:
bal_labels = ['Balance: 0 - 100181',
              'Balance: 100181 - 119839',
              'Balance: 119829 - 139512',
              'Balance: 139512 - 250898']
sal_labels = ['EstSalary: 11 - 41818',
              'EstSalary: 41818 - 80414',
              'EstSalary: 80414 - 120377',
              'EstSalary: 120377 - 160494',
              'EstSalary: 160494 - 200000']


df['Balance_label'] = pd.qcut(df['Balance'], q=4, labels=bal_labels)
df['EstimatedSalary_label'] = pd.qcut(df['EstimatedSalary'], q=5, labels=sal_labels)

df.head()
Out[312]:
CreditScore Age Tenure Balance NumOfProducts HasCrCard IsActiveMember EstimatedSalary Exited Geography_France Geography_Germany Geography_Spain Gender_Female Gender_Male Balance_label EstimatedSalary_label Balance_range EstimatedSalary_range
1 608 41 1 83807.86 1 0 1 112542.58 0 0 0 1 1 0 Balance: 0 - 100181 EstSalary: 80414 - 120377 (3768.689, 100181.975] (80414.646, 120377.52]
2 502 42 8 159660.80 3 1 0 113931.57 1 1 0 0 1 0 Balance: 139512 - 250898 EstSalary: 80414 - 120377 (139512.29, 250898.09] (80414.646, 120377.52]
4 850 43 2 125510.82 1 1 1 79084.10 0 0 0 1 1 0 Balance: 119829 - 139512 EstSalary: 41818 - 80414 (119839.69, 139512.29] (41818.154, 80414.646]
5 645 44 8 113755.78 2 1 0 149756.71 1 0 0 1 0 1 Balance: 100181 - 119839 EstSalary: 120377 - 160494 (100181.975, 119839.69] (120377.52, 160494.082]
7 383 29 4 115046.74 4 1 0 119346.88 1 0 1 0 1 0 Balance: 100181 - 119839 EstSalary: 80414 - 120377 (100181.975, 119839.69] (80414.646, 120377.52]
In [313]:
             

df.drop(['Balance_range'], axis=1, inplace=True) 
df.drop(['EstimatedSalary_range'], axis=1, inplace=True) 
    
oneHotCols=["Balance_label","EstimatedSalary_label"]


df=pd.get_dummies(df, columns=oneHotCols)
df.head(10)
Out[313]:
CreditScore Age Tenure Balance NumOfProducts HasCrCard IsActiveMember EstimatedSalary Exited Geography_France ... Gender_Male Balance_label_Balance: 0 - 100181 Balance_label_Balance: 100181 - 119839 Balance_label_Balance: 119829 - 139512 Balance_label_Balance: 139512 - 250898 EstimatedSalary_label_EstSalary: 11 - 41818 EstimatedSalary_label_EstSalary: 41818 - 80414 EstimatedSalary_label_EstSalary: 80414 - 120377 EstimatedSalary_label_EstSalary: 120377 - 160494 EstimatedSalary_label_EstSalary: 160494 - 200000
1 608 41 1 83807.86 1 0 1 112542.58 0 0 ... 0 1 0 0 0 0 0 1 0 0
2 502 42 8 159660.80 3 1 0 113931.57 1 1 ... 0 0 0 0 1 0 0 1 0 0
4 850 43 2 125510.82 1 1 1 79084.10 0 0 ... 0 0 0 1 0 0 1 0 0 0
5 645 44 8 113755.78 2 1 0 149756.71 1 0 ... 1 0 1 0 0 0 0 0 1 0
7 383 29 4 115046.74 4 1 0 119346.88 1 0 ... 0 0 1 0 0 0 0 1 0 0
8 501 44 4 142051.07 2 0 1 74940.50 0 1 ... 1 0 0 0 1 0 1 0 0 0
9 684 27 2 134603.88 1 1 1 71725.73 0 1 ... 1 0 0 1 0 0 1 0 0 0
10 528 31 6 102016.72 2 0 0 80181.12 0 1 ... 1 0 1 0 0 0 1 0 0 0
15 616 45 3 143129.41 2 0 1 64327.26 0 0 ... 1 0 0 0 1 0 1 0 0 0
16 653 58 1 132602.88 1 1 0 5097.67 1 0 ... 1 0 0 1 0 1 0 0 0 0

10 rows × 23 columns

In [315]:
df.drop(['Balance'], axis=1, inplace=True) 
df.drop(['EstimatedSalary'], axis=1, inplace=True) 

df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 6383 entries, 1 to 9999
Data columns (total 21 columns):
 #   Column                                            Non-Null Count  Dtype
---  ------                                            --------------  -----
 0   CreditScore                                       6383 non-null   int64
 1   Age                                               6383 non-null   int64
 2   Tenure                                            6383 non-null   int64
 3   NumOfProducts                                     6383 non-null   int64
 4   HasCrCard                                         6383 non-null   int64
 5   IsActiveMember                                    6383 non-null   int64
 6   Exited                                            6383 non-null   int64
 7   Geography_France                                  6383 non-null   uint8
 8   Geography_Germany                                 6383 non-null   uint8
 9   Geography_Spain                                   6383 non-null   uint8
 10  Gender_Female                                     6383 non-null   uint8
 11  Gender_Male                                       6383 non-null   uint8
 12  Balance_label_Balance: 0 - 100181                 6383 non-null   uint8
 13  Balance_label_Balance: 100181 - 119839            6383 non-null   uint8
 14  Balance_label_Balance: 119829 - 139512            6383 non-null   uint8
 15  Balance_label_Balance: 139512 - 250898            6383 non-null   uint8
 16  EstimatedSalary_label_EstSalary: 11 - 41818       6383 non-null   uint8
 17  EstimatedSalary_label_EstSalary: 41818 - 80414    6383 non-null   uint8
 18  EstimatedSalary_label_EstSalary: 80414 - 120377   6383 non-null   uint8
 19  EstimatedSalary_label_EstSalary: 120377 - 160494  6383 non-null   uint8
 20  EstimatedSalary_label_EstSalary: 160494 - 200000  6383 non-null   uint8
dtypes: int64(7), uint8(14)
memory usage: 486.2 KB
In [317]:
df.isnull().sum().sort_values(ascending=False)
Out[317]:
CreditScore                                         0
Gender_Male                                         0
EstimatedSalary_label_EstSalary: 120377 - 160494    0
EstimatedSalary_label_EstSalary: 80414 - 120377     0
EstimatedSalary_label_EstSalary: 41818 - 80414      0
EstimatedSalary_label_EstSalary: 11 - 41818         0
Balance_label_Balance: 139512 - 250898              0
Balance_label_Balance: 119829 - 139512              0
Balance_label_Balance: 100181 - 119839              0
Balance_label_Balance: 0 - 100181                   0
Gender_Female                                       0
Age                                                 0
Geography_Spain                                     0
Geography_Germany                                   0
Geography_France                                    0
Exited                                              0
IsActiveMember                                      0
HasCrCard                                           0
NumOfProducts                                       0
Tenure                                              0
EstimatedSalary_label_EstSalary: 160494 - 200000    0
dtype: int64
In [316]:
# labeled_barplot(Data, "Gender")


columns_list = []

for i in df.columns:
    if df.dtypes[i]!=object:
        columns_list.append(i)

for i in columns_list:
    labeled_barplot(df,i) 
In [417]:
sns.pairplot(data=df[columns_list], diag_kind="kde")
plt.show()

Observations¶

  1. France has nearly double the rows as Spain and Germany. This may mean the data is not balanced
  2. Gender does seem well balanced proportionaly
  3. We need to bucket the Ages still. The 62 seems unusually high. It probably represents 62+, so we will make a note of that
  4. Tenure is failry well balanced
  5. NumOfProducts still looks right skewed, with the highest count being 5084 for 1, and only 60 for 3.5
  6. HasCrCard is unbalanced. Most people seem to have a credit card with the bank, and few do not
  7. It looks like, because of how the Age was binned, that most customers are between 31 and 40 years old
  8. It looks like the majority of people have Balances under 70k.
In [321]:
#correlation
plt.figure(figsize=(20,10))
sns.heatmap(df.corr(),annot=True,cmap='Spectral',vmin=-1,vmax=1)
plt.show()
In [327]:
df.head()
Out[327]:
CreditScore Age Tenure NumOfProducts HasCrCard IsActiveMember Exited Geography_France Geography_Germany Geography_Spain ... Gender_Male Balance_label_Balance: 0 - 100181 Balance_label_Balance: 100181 - 119839 Balance_label_Balance: 119829 - 139512 Balance_label_Balance: 139512 - 250898 EstimatedSalary_label_EstSalary: 11 - 41818 EstimatedSalary_label_EstSalary: 41818 - 80414 EstimatedSalary_label_EstSalary: 80414 - 120377 EstimatedSalary_label_EstSalary: 120377 - 160494 EstimatedSalary_label_EstSalary: 160494 - 200000
1 608 41 1 1 0 1 0 0 0 1 ... 0 1 0 0 0 0 0 1 0 0
2 502 42 8 3 1 0 1 1 0 0 ... 0 0 0 0 1 0 0 1 0 0
4 850 43 2 1 1 1 0 0 0 1 ... 0 0 0 1 0 0 1 0 0 0
5 645 44 8 2 1 0 1 0 0 1 ... 1 0 1 0 0 0 0 0 1 0
7 383 29 4 4 1 0 1 0 1 0 ... 0 0 1 0 0 0 0 1 0 0

5 rows × 21 columns

In [322]:
import pandas as pd
pd.set_option('display.max_rows', None)
#this one removes the 1 correlations due to variables being compared to each other
# Create correlation matrix
corr_mat = df.corr(method='pearson')

# Drop correlations where the variable names are the same
corr_mat = corr_mat.mask(np.tril(np.ones_like(corr_mat, dtype=bool)))

# Convert correlation matrix to 1-D Series and sort
sorted_mat = corr_mat.unstack().drop_duplicates().sort_values()

# Remove correlations with a value of 1 or null values
sorted_mat = sorted_mat[(sorted_mat != 1) & (~sorted_mat.isnull())]

print(sorted_mat)
Gender_Male                                       Gender_Female                                      -1.00
Geography_Germany                                 Geography_France                                   -0.67
Geography_Spain                                   Geography_France                                   -0.41
                                                  Geography_Germany                                  -0.40
Balance_label_Balance: 100181 - 119839            Balance_label_Balance: 0 - 100181                  -0.33
Balance_label_Balance: 139512 - 250898            Balance_label_Balance: 100181 - 119839             -0.33
                                                  Balance_label_Balance: 0 - 100181                  -0.33
Balance_label_Balance: 119829 - 139512            Balance_label_Balance: 0 - 100181                  -0.33
Balance_label_Balance: 139512 - 250898            Balance_label_Balance: 119829 - 139512             -0.33
Balance_label_Balance: 119829 - 139512            Balance_label_Balance: 100181 - 119839             -0.33
EstimatedSalary_label_EstSalary: 80414 - 120377   EstimatedSalary_label_EstSalary: 11 - 41818        -0.25
EstimatedSalary_label_EstSalary: 160494 - 200000  EstimatedSalary_label_EstSalary: 80414 - 120377    -0.25
                                                  EstimatedSalary_label_EstSalary: 11 - 41818        -0.25
                                                  EstimatedSalary_label_EstSalary: 41818 - 80414     -0.25
EstimatedSalary_label_EstSalary: 120377 - 160494  EstimatedSalary_label_EstSalary: 11 - 41818        -0.25
EstimatedSalary_label_EstSalary: 160494 - 200000  EstimatedSalary_label_EstSalary: 120377 - 160494   -0.25
EstimatedSalary_label_EstSalary: 80414 - 120377   EstimatedSalary_label_EstSalary: 41818 - 80414     -0.25
EstimatedSalary_label_EstSalary: 120377 - 160494  EstimatedSalary_label_EstSalary: 80414 - 120377    -0.25
EstimatedSalary_label_EstSalary: 41818 - 80414    EstimatedSalary_label_EstSalary: 11 - 41818        -0.25
EstimatedSalary_label_EstSalary: 120377 - 160494  EstimatedSalary_label_EstSalary: 41818 - 80414     -0.25
Exited                                            IsActiveMember                                     -0.17
Geography_France                                  NumOfProducts                                      -0.13
                                                  Exited                                             -0.11
Gender_Male                                       Exited                                             -0.11
Geography_Spain                                   NumOfProducts                                      -0.07
Balance_label_Balance: 0 - 100181                 Geography_Germany                                  -0.06
Geography_Spain                                   Exited                                             -0.05
Geography_France                                  Age                                                -0.05
Balance_label_Balance: 0 - 100181                 Exited                                             -0.05
Balance_label_Balance: 139512 - 250898            Geography_Germany                                  -0.04
IsActiveMember                                    Tenure                                             -0.04
Balance_label_Balance: 100181 - 119839            Geography_France                                   -0.04
Gender_Male                                       Geography_Germany                                  -0.04
                                                  NumOfProducts                                      -0.04
EstimatedSalary_label_EstSalary: 160494 - 200000  Geography_Spain                                    -0.03
Gender_Female                                     IsActiveMember                                     -0.03
Exited                                            CreditScore                                        -0.03
Balance_label_Balance: 100181 - 119839            Geography_Spain                                    -0.03
Gender_Female                                     Geography_Spain                                    -0.03
Geography_Germany                                 IsActiveMember                                     -0.03
Gender_Male                                       Age                                                -0.03
Balance_label_Balance: 119829 - 139512            Geography_France                                   -0.03
EstimatedSalary_label_EstSalary: 11 - 41818       NumOfProducts                                      -0.02
EstimatedSalary_label_EstSalary: 120377 - 160494  Gender_Male                                        -0.02
EstimatedSalary_label_EstSalary: 11 - 41818       Balance_label_Balance: 119829 - 139512             -0.02
EstimatedSalary_label_EstSalary: 41818 - 80414    Balance_label_Balance: 100181 - 119839             -0.02
HasCrCard                                         Age                                                -0.02
Geography_Spain                                   HasCrCard                                          -0.02
IsActiveMember                                    HasCrCard                                          -0.02
Balance_label_Balance: 139512 - 250898            Age                                                -0.02
EstimatedSalary_label_EstSalary: 120377 - 160494  Geography_Germany                                  -0.02
EstimatedSalary_label_EstSalary: 80414 - 120377   IsActiveMember                                     -0.02
Balance_label_Balance: 139512 - 250898            Gender_Female                                      -0.02
Balance_label_Balance: 119829 - 139512            Geography_Spain                                    -0.02
Balance_label_Balance: 0 - 100181                 Gender_Male                                        -0.02
Gender_Female                                     Tenure                                             -0.02
HasCrCard                                         CreditScore                                        -0.01
Gender_Female                                     Geography_France                                   -0.01
Balance_label_Balance: 139512 - 250898            Exited                                             -0.01
Balance_label_Balance: 0 - 100181                 HasCrCard                                          -0.01
                                                  Tenure                                             -0.01
Age                                               CreditScore                                        -0.01
EstimatedSalary_label_EstSalary: 80414 - 120377   Tenure                                             -0.01
                                                  Balance_label_Balance: 119829 - 139512             -0.01
EstimatedSalary_label_EstSalary: 160494 - 200000  Age                                                -0.01
EstimatedSalary_label_EstSalary: 120377 - 160494  Balance_label_Balance: 0 - 100181                  -0.01
                                                  CreditScore                                        -0.01
                                                  HasCrCard                                          -0.01
EstimatedSalary_label_EstSalary: 80414 - 120377   Geography_Germany                                  -0.01
EstimatedSalary_label_EstSalary: 41818 - 80414    Exited                                             -0.01
                                                  Geography_Spain                                    -0.01
EstimatedSalary_label_EstSalary: 11 - 41818       Gender_Female                                      -0.01
Balance_label_Balance: 100181 - 119839            HasCrCard                                          -0.01
EstimatedSalary_label_EstSalary: 160494 - 200000  IsActiveMember                                     -0.01
Balance_label_Balance: 119829 - 139512            CreditScore                                        -0.01
EstimatedSalary_label_EstSalary: 11 - 41818       Tenure                                             -0.01
Geography_France                                  Tenure                                             -0.01
                                                  HasCrCard                                          -0.01
EstimatedSalary_label_EstSalary: 41818 - 80414    Balance_label_Balance: 139512 - 250898             -0.01
EstimatedSalary_label_EstSalary: 120377 - 160494  Age                                                -0.01
Balance_label_Balance: 100181 - 119839            Gender_Male                                        -0.01
Gender_Female                                     HasCrCard                                          -0.01
Balance_label_Balance: 119829 - 139512            Gender_Female                                      -0.01
EstimatedSalary_label_EstSalary: 120377 - 160494  Geography_France                                   -0.01
EstimatedSalary_label_EstSalary: 160494 - 200000  Gender_Female                                      -0.01
EstimatedSalary_label_EstSalary: 80414 - 120377   NumOfProducts                                      -0.01
Balance_label_Balance: 119829 - 139512            IsActiveMember                                     -0.01
IsActiveMember                                    NumOfProducts                                      -0.01
Balance_label_Balance: 139512 - 250898            IsActiveMember                                     -0.01
EstimatedSalary_label_EstSalary: 80414 - 120377   CreditScore                                        -0.00
EstimatedSalary_label_EstSalary: 41818 - 80414    Geography_Germany                                  -0.00
EstimatedSalary_label_EstSalary: 11 - 41818       Geography_France                                   -0.00
EstimatedSalary_label_EstSalary: 80414 - 120377   Gender_Female                                      -0.00
EstimatedSalary_label_EstSalary: 160494 - 200000  Balance_label_Balance: 139512 - 250898             -0.00
EstimatedSalary_label_EstSalary: 41818 - 80414    Tenure                                             -0.00
                                                  CreditScore                                        -0.00
                                                  Age                                                -0.00
EstimatedSalary_label_EstSalary: 80414 - 120377   Geography_France                                   -0.00
Gender_Male                                       CreditScore                                        -0.00
Balance_label_Balance: 139512 - 250898            CreditScore                                        -0.00
Balance_label_Balance: 0 - 100181                 Age                                                -0.00
Geography_France                                  CreditScore                                        -0.00
Exited                                            HasCrCard                                          -0.00
EstimatedSalary_label_EstSalary: 120377 - 160494  Exited                                             -0.00
EstimatedSalary_label_EstSalary: 41818 - 80414    Gender_Female                                      -0.00
EstimatedSalary_label_EstSalary: 11 - 41818       Geography_Spain                                    -0.00
Geography_France                                  IsActiveMember                                     -0.00
Exited                                            Tenure                                             -0.00
Balance_label_Balance: 119829 - 139512            NumOfProducts                                      -0.00
EstimatedSalary_label_EstSalary: 120377 - 160494  Balance_label_Balance: 139512 - 250898             -0.00
EstimatedSalary_label_EstSalary: 160494 - 200000  HasCrCard                                          -0.00
EstimatedSalary_label_EstSalary: 11 - 41818       HasCrCard                                          -0.00
Geography_Spain                                   CreditScore                                        -0.00
Balance_label_Balance: 100181 - 119839            IsActiveMember                                     -0.00
EstimatedSalary_label_EstSalary: 80414 - 120377   Exited                                             -0.00
EstimatedSalary_label_EstSalary: 160494 - 200000  Balance_label_Balance: 100181 - 119839             -0.00
Balance_label_Balance: 139512 - 250898            NumOfProducts                                      -0.00
Balance_label_Balance: 0 - 100181                 NumOfProducts                                      -0.00
EstimatedSalary_label_EstSalary: 160494 - 200000  Tenure                                              0.00
Geography_Spain                                   Tenure                                              0.00
EstimatedSalary_label_EstSalary: 80414 - 120377   Balance_label_Balance: 100181 - 119839              0.00
EstimatedSalary_label_EstSalary: 41818 - 80414    Balance_label_Balance: 0 - 100181                   0.00
                                                  NumOfProducts                                       0.00
Balance_label_Balance: 100181 - 119839            NumOfProducts                                       0.00
EstimatedSalary_label_EstSalary: 160494 - 200000  Geography_France                                    0.00
EstimatedSalary_label_EstSalary: 120377 - 160494  IsActiveMember                                      0.00
EstimatedSalary_label_EstSalary: 160494 - 200000  Balance_label_Balance: 0 - 100181                   0.00
EstimatedSalary_label_EstSalary: 80414 - 120377   HasCrCard                                           0.00
EstimatedSalary_label_EstSalary: 11 - 41818       Age                                                 0.00
EstimatedSalary_label_EstSalary: 41818 - 80414    Gender_Male                                         0.00
EstimatedSalary_label_EstSalary: 11 - 41818       Exited                                              0.00
Geography_Germany                                 CreditScore                                         0.00
EstimatedSalary_label_EstSalary: 160494 - 200000  Balance_label_Balance: 119829 - 139512              0.00
Tenure                                            CreditScore                                         0.00
Gender_Female                                     CreditScore                                         0.00
HasCrCard                                         NumOfProducts                                       0.00
EstimatedSalary_label_EstSalary: 11 - 41818       Balance_label_Balance: 0 - 100181                   0.00
Geography_Spain                                   Age                                                 0.00
Balance_label_Balance: 139512 - 250898            Tenure                                              0.00
EstimatedSalary_label_EstSalary: 120377 - 160494  Balance_label_Balance: 119829 - 139512              0.00
EstimatedSalary_label_EstSalary: 80414 - 120377   Gender_Male                                         0.00
Balance_label_Balance: 100181 - 119839            Tenure                                              0.00
                                                  CreditScore                                         0.01
EstimatedSalary_label_EstSalary: 11 - 41818       Geography_Germany                                   0.01
Balance_label_Balance: 119829 - 139512            Tenure                                              0.01
EstimatedSalary_label_EstSalary: 80414 - 120377   Balance_label_Balance: 139512 - 250898              0.01
                                                  Balance_label_Balance: 0 - 100181                   0.01
Balance_label_Balance: 0 - 100181                 CreditScore                                         0.01
NumOfProducts                                     Tenure                                              0.01
EstimatedSalary_label_EstSalary: 11 - 41818       Balance_label_Balance: 139512 - 250898              0.01
EstimatedSalary_label_EstSalary: 160494 - 200000  Gender_Male                                         0.01
Balance_label_Balance: 119829 - 139512            Gender_Male                                         0.01
Gender_Male                                       HasCrCard                                           0.01
EstimatedSalary_label_EstSalary: 160494 - 200000  CreditScore                                         0.01
Balance_label_Balance: 100181 - 119839            Gender_Female                                       0.01
EstimatedSalary_label_EstSalary: 11 - 41818       IsActiveMember                                      0.01
Tenure                                            Age                                                 0.01
Balance_label_Balance: 100181 - 119839            Age                                                 0.01
Geography_Germany                                 Tenure                                              0.01
Balance_label_Balance: 139512 - 250898            HasCrCard                                           0.01
EstimatedSalary_label_EstSalary: 120377 - 160494  Balance_label_Balance: 100181 - 119839              0.01
NumOfProducts                                     CreditScore                                         0.01
EstimatedSalary_label_EstSalary: 41818 - 80414    HasCrCard                                           0.01
EstimatedSalary_label_EstSalary: 11 - 41818       Gender_Male                                         0.01
EstimatedSalary_label_EstSalary: 160494 - 200000  Exited                                              0.01
NumOfProducts                                     Age                                                 0.01
EstimatedSalary_label_EstSalary: 11 - 41818       CreditScore                                         0.01
Balance_label_Balance: 119829 - 139512            Age                                                 0.01
EstimatedSalary_label_EstSalary: 11 - 41818       Balance_label_Balance: 100181 - 119839              0.01
Balance_label_Balance: 0 - 100181                 IsActiveMember                                      0.01
EstimatedSalary_label_EstSalary: 41818 - 80414    Geography_France                                    0.01
EstimatedSalary_label_EstSalary: 160494 - 200000  NumOfProducts                                       0.01
Balance_label_Balance: 139512 - 250898            Geography_Spain                                     0.01
Gender_Male                                       Geography_France                                    0.01
                                                  Tenure                                              0.02
Balance_label_Balance: 119829 - 139512            HasCrCard                                           0.02
EstimatedSalary_label_EstSalary: 80414 - 120377   Geography_Spain                                     0.02
Balance_label_Balance: 0 - 100181                 Gender_Female                                       0.02
Balance_label_Balance: 119829 - 139512            Exited                                              0.02
Balance_label_Balance: 139512 - 250898            Gender_Male                                         0.02
EstimatedSalary_label_EstSalary: 41818 - 80414    IsActiveMember                                      0.02
EstimatedSalary_label_EstSalary: 120377 - 160494  NumOfProducts                                       0.02
EstimatedSalary_label_EstSalary: 80414 - 120377   Age                                                 0.02
EstimatedSalary_label_EstSalary: 120377 - 160494  Gender_Female                                       0.02
                                                  Tenure                                              0.03
Geography_Germany                                 HasCrCard                                           0.03
Gender_Female                                     Age                                                 0.03
HasCrCard                                         Tenure                                              0.03
Gender_Male                                       Geography_Spain                                     0.03
EstimatedSalary_label_EstSalary: 160494 - 200000  Geography_Germany                                   0.03
EstimatedSalary_label_EstSalary: 41818 - 80414    Balance_label_Balance: 119829 - 139512              0.03
Gender_Male                                       IsActiveMember                                      0.03
IsActiveMember                                    CreditScore                                         0.03
EstimatedSalary_label_EstSalary: 120377 - 160494  Geography_Spain                                     0.03
Balance_label_Balance: 0 - 100181                 Geography_Spain                                     0.03
Balance_label_Balance: 139512 - 250898            Geography_France                                    0.03
Balance_label_Balance: 0 - 100181                 Geography_France                                    0.03
Geography_Spain                                   IsActiveMember                                      0.03
Gender_Female                                     NumOfProducts                                       0.04
                                                  Geography_Germany                                   0.04
Balance_label_Balance: 119829 - 139512            Geography_Germany                                   0.04
Balance_label_Balance: 100181 - 119839            Exited                                              0.04
Geography_Germany                                 Age                                                 0.05
IsActiveMember                                    Age                                                 0.05
Balance_label_Balance: 100181 - 119839            Geography_Germany                                   0.06
Exited                                            NumOfProducts                                       0.08
Gender_Female                                     Exited                                              0.11
Geography_Germany                                 Exited                                              0.16
                                                  NumOfProducts                                       0.19
Exited                                            Age                                                 0.33
dtype: float64
In [324]:
df.head()
Out[324]:
CreditScore Age Tenure NumOfProducts HasCrCard IsActiveMember Exited Geography_France Geography_Germany Geography_Spain ... Gender_Male Balance_label_Balance: 0 - 100181 Balance_label_Balance: 100181 - 119839 Balance_label_Balance: 119829 - 139512 Balance_label_Balance: 139512 - 250898 EstimatedSalary_label_EstSalary: 11 - 41818 EstimatedSalary_label_EstSalary: 41818 - 80414 EstimatedSalary_label_EstSalary: 80414 - 120377 EstimatedSalary_label_EstSalary: 120377 - 160494 EstimatedSalary_label_EstSalary: 160494 - 200000
1 608 41 1 1 0 1 0 0 0 1 ... 0 1 0 0 0 0 0 1 0 0
2 502 42 8 3 1 0 1 1 0 0 ... 0 0 0 0 1 0 0 1 0 0
4 850 43 2 1 1 1 0 0 0 1 ... 0 0 0 1 0 0 1 0 0 0
5 645 44 8 2 1 0 1 0 0 1 ... 1 0 1 0 0 0 0 0 1 0
7 383 29 4 4 1 0 1 0 1 0 ... 0 0 1 0 0 0 0 1 0 0

5 rows × 21 columns

In [329]:
# Select the columns before the 7th column
left_columns = df.iloc[:, 6:7]

# Select the columns after the rightmost 9 columns
right_columns = df.iloc[:, -9:]

# Concatenate the selected columns
test_df = pd.concat([left_columns, right_columns], axis=1)

test_df.head()
Out[329]:
Exited Balance_label_Balance: 0 - 100181 Balance_label_Balance: 100181 - 119839 Balance_label_Balance: 119829 - 139512 Balance_label_Balance: 139512 - 250898 EstimatedSalary_label_EstSalary: 11 - 41818 EstimatedSalary_label_EstSalary: 41818 - 80414 EstimatedSalary_label_EstSalary: 80414 - 120377 EstimatedSalary_label_EstSalary: 120377 - 160494 EstimatedSalary_label_EstSalary: 160494 - 200000
1 0 1 0 0 0 0 0 1 0 0
2 1 0 0 0 1 0 0 1 0 0
4 0 0 0 1 0 0 1 0 0 0
5 1 0 1 0 0 0 0 0 1 0
7 1 0 1 0 0 0 0 1 0 0
In [330]:
test_df['is_Filter'] = test_df['Exited'] == 1  # for hue
cols_to_exclude = ['Cat']
sns.pairplot(test_df[[colname for colname in test_df.columns if colname not in cols_to_exclude]], hue = 'is_Filter')
test_df.drop(['is_Filter'], axis=1, inplace=True)
In [ ]:
 
In [ ]:
 
In [323]:
#correlation
test_df = df
test_df['is_Filter'] = test_df['Exited'] == 1  # for hue
cols_to_exclude = ['Cat']
sns.pairplot(test_df[[colname for colname in test_df.columns if colname not in cols_to_exclude]], hue = 'is_Filter')
test_df.drop(['is_Filter'], axis=1, inplace=True)

Observations¶

  1. It looks like People between the Ages of 40 and 60 exit the most regardless of CreditScore, Balance, or EstimatedSalary.
  2. There is a fairly strong correlation between Germany and Blanace. It looks like people in GErmany Exit the program when their balance is between about 100,000 and 200,00, and people outside of Germany (SPain and France) tend to exit the program when their balance is over 200,000.
  3. There is a negative correlation between France and Balance. Perhaps the lower the balance the more likely they are to exit.
  4. In Spain most of the Males are exiting. in GErmany there is a balance of males and females that exit the program
  5. Most people regardless of geography and age have over 2 products.
In [331]:
### Cross validate the accuracy of the data

# separating data into X and Y
X = df.drop(['Exited'], axis = 1)
Y = df['Exited']

from sklearn import preprocessing
# scale all the columns of the mpg_df. This will produce a numpy array
X_scaled = preprocessing.scale(X)
X_scaled = pd.DataFrame(X_scaled, columns=X.columns) 

# creating train and test sets
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.30, random_state=42, stratify = Y)

# defining kfold
kfold = KFold(n_splits=10, random_state=1, shuffle = True)

# to build logstic regression model
from sklearn.linear_model import LogisticRegression

# defining the model
model = LogisticRegression(random_state = 1)

# storing accuracy values of model for every fold in "results"
results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy')

# let's see the mean accuracy score
print("Accuracy: %.3f%% (%.3f%%)" % (results.mean()*100.0, results.std()*100.0))
Accuracy: 78.559% (2.014%)
In [332]:
X_train.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 4468 entries, 7112 to 4399
Data columns (total 20 columns):
 #   Column                                            Non-Null Count  Dtype
---  ------                                            --------------  -----
 0   CreditScore                                       4468 non-null   int64
 1   Age                                               4468 non-null   int64
 2   Tenure                                            4468 non-null   int64
 3   NumOfProducts                                     4468 non-null   int64
 4   HasCrCard                                         4468 non-null   int64
 5   IsActiveMember                                    4468 non-null   int64
 6   Geography_France                                  4468 non-null   uint8
 7   Geography_Germany                                 4468 non-null   uint8
 8   Geography_Spain                                   4468 non-null   uint8
 9   Gender_Female                                     4468 non-null   uint8
 10  Gender_Male                                       4468 non-null   uint8
 11  Balance_label_Balance: 0 - 100181                 4468 non-null   uint8
 12  Balance_label_Balance: 100181 - 119839            4468 non-null   uint8
 13  Balance_label_Balance: 119829 - 139512            4468 non-null   uint8
 14  Balance_label_Balance: 139512 - 250898            4468 non-null   uint8
 15  EstimatedSalary_label_EstSalary: 11 - 41818       4468 non-null   uint8
 16  EstimatedSalary_label_EstSalary: 41818 - 80414    4468 non-null   uint8
 17  EstimatedSalary_label_EstSalary: 80414 - 120377   4468 non-null   uint8
 18  EstimatedSalary_label_EstSalary: 120377 - 160494  4468 non-null   uint8
 19  EstimatedSalary_label_EstSalary: 160494 - 200000  4468 non-null   uint8
dtypes: int64(6), uint8(14)
memory usage: 305.4 KB

The model's average accuracy on the dataset is approximately 79.629%, which means it correctly predicts the class labels for about 78.914% of the instances on average.

The standard deviation of 1.559% suggests that the model's performance is relatively consistent across different folds. In other words, the accuracy scores from one fold to another do not vary widely.

In [337]:
#Model #1

#initialize the model
model_1 = Sequential()
# This adds the input layer (by specifying input dimension) AND the first hidden layer (units)
#units below is the number of neurons in the dense layer
model_1.add(Dense(units=16, input_dim = 20,activation='relu'))   # input of 10 columns as shown above
# hidden layer
model_1.add(Dense(units=24,activation='relu'))
#Adding Dropout to prevent overfitting 
model_1.add(Dropout(0.5))
model_1.add(Dense(24,activation='relu'))
model_1.add(Dense(24,activation='relu'))
# Adding the output layer
# Notice that we do not need to specify input dim. 
# we have an output of 1 node, which is the the desired dimensions of our output (fraud or not)
# We use the sigmoid because we want probability outcomes
model_1.add(Dense(1,activation='sigmoid')) 
# Create optimizer with default learning rate
# Compile the model
model_1.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
In [338]:
 
In [339]:
model_1.summary()
Model: "sequential_21"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_105 (Dense)           (None, 16)                336       
                                                                 
 dense_106 (Dense)           (None, 24)                408       
                                                                 
 dropout_28 (Dropout)        (None, 24)                0         
                                                                 
 dense_107 (Dense)           (None, 24)                600       
                                                                 
 dense_108 (Dense)           (None, 24)                600       
                                                                 
 dense_109 (Dense)           (None, 1)                 25        
                                                                 
=================================================================
Total params: 1,969
Trainable params: 1,969
Non-trainable params: 0
_________________________________________________________________
In [340]:
#fitting the model
history1=model_1.fit(X_train,y_train,batch_size=15,epochs=100,validation_split=0.2)
Epoch 1/100
239/239 [==============================] - 1s 2ms/step - loss: 3.9876 - accuracy: 0.6900 - val_loss: 0.5673 - val_accuracy: 0.7964
Epoch 2/100
239/239 [==============================] - 0s 947us/step - loss: 0.7712 - accuracy: 0.7241 - val_loss: 0.6474 - val_accuracy: 0.7964
Epoch 3/100
239/239 [==============================] - 0s 900us/step - loss: 0.6072 - accuracy: 0.7652 - val_loss: 0.5312 - val_accuracy: 0.7964
Epoch 4/100
239/239 [==============================] - 0s 898us/step - loss: 0.5674 - accuracy: 0.7722 - val_loss: 0.5079 - val_accuracy: 0.7964
Epoch 5/100
239/239 [==============================] - 0s 897us/step - loss: 0.5852 - accuracy: 0.7753 - val_loss: 0.5519 - val_accuracy: 0.7964
Epoch 6/100
239/239 [==============================] - 0s 916us/step - loss: 0.5421 - accuracy: 0.7941 - val_loss: 0.5065 - val_accuracy: 0.7964
Epoch 7/100
239/239 [==============================] - 0s 895us/step - loss: 0.5255 - accuracy: 0.7971 - val_loss: 0.5566 - val_accuracy: 0.7964
Epoch 8/100
239/239 [==============================] - 0s 898us/step - loss: 0.5220 - accuracy: 0.7966 - val_loss: 0.5163 - val_accuracy: 0.7964
Epoch 9/100
239/239 [==============================] - 0s 929us/step - loss: 0.5125 - accuracy: 0.7971 - val_loss: 0.5245 - val_accuracy: 0.7964
Epoch 10/100
239/239 [==============================] - 0s 945us/step - loss: 0.5083 - accuracy: 0.7971 - val_loss: 0.5064 - val_accuracy: 0.7964
Epoch 11/100
239/239 [==============================] - 0s 907us/step - loss: 0.5067 - accuracy: 0.7971 - val_loss: 0.5057 - val_accuracy: 0.7964
Epoch 12/100
239/239 [==============================] - 0s 930us/step - loss: 0.5085 - accuracy: 0.7971 - val_loss: 0.5059 - val_accuracy: 0.7964
Epoch 13/100
239/239 [==============================] - 0s 913us/step - loss: 0.5069 - accuracy: 0.7971 - val_loss: 0.5108 - val_accuracy: 0.7964
Epoch 14/100
239/239 [==============================] - 0s 915us/step - loss: 0.5061 - accuracy: 0.7971 - val_loss: 0.5097 - val_accuracy: 0.7964
Epoch 15/100
239/239 [==============================] - 0s 894us/step - loss: 0.5065 - accuracy: 0.7971 - val_loss: 0.5072 - val_accuracy: 0.7964
Epoch 16/100
239/239 [==============================] - 0s 957us/step - loss: 0.5058 - accuracy: 0.7971 - val_loss: 0.5091 - val_accuracy: 0.7964
Epoch 17/100
239/239 [==============================] - 0s 913us/step - loss: 0.5049 - accuracy: 0.7971 - val_loss: 0.5095 - val_accuracy: 0.7964
Epoch 18/100
239/239 [==============================] - 0s 983us/step - loss: 0.5074 - accuracy: 0.7971 - val_loss: 0.5056 - val_accuracy: 0.7964
Epoch 19/100
239/239 [==============================] - 0s 985us/step - loss: 0.5057 - accuracy: 0.7971 - val_loss: 0.5064 - val_accuracy: 0.7964
Epoch 20/100
239/239 [==============================] - 0s 987us/step - loss: 0.5052 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 21/100
239/239 [==============================] - 0s 898us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5055 - val_accuracy: 0.7964
Epoch 22/100
239/239 [==============================] - 0s 929us/step - loss: 0.5045 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 23/100
239/239 [==============================] - 0s 927us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5057 - val_accuracy: 0.7964
Epoch 24/100
239/239 [==============================] - 0s 913us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 25/100
239/239 [==============================] - 0s 924us/step - loss: 0.5044 - accuracy: 0.7971 - val_loss: 0.5059 - val_accuracy: 0.7964
Epoch 26/100
239/239 [==============================] - 0s 912us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 27/100
239/239 [==============================] - 0s 942us/step - loss: 0.5046 - accuracy: 0.7971 - val_loss: 0.5055 - val_accuracy: 0.7964
Epoch 28/100
239/239 [==============================] - 0s 982us/step - loss: 0.5046 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 29/100
239/239 [==============================] - 0s 933us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 30/100
239/239 [==============================] - 0s 959us/step - loss: 0.5046 - accuracy: 0.7971 - val_loss: 0.5055 - val_accuracy: 0.7964
Epoch 31/100
239/239 [==============================] - 0s 921us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 32/100
239/239 [==============================] - 0s 954us/step - loss: 0.5046 - accuracy: 0.7971 - val_loss: 0.5055 - val_accuracy: 0.7964
Epoch 33/100
239/239 [==============================] - 0s 889us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 34/100
239/239 [==============================] - 0s 903us/step - loss: 0.5046 - accuracy: 0.7971 - val_loss: 0.5056 - val_accuracy: 0.7964
Epoch 35/100
239/239 [==============================] - 0s 900us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 36/100
239/239 [==============================] - 0s 883us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5055 - val_accuracy: 0.7964
Epoch 37/100
239/239 [==============================] - 0s 931us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 38/100
239/239 [==============================] - 0s 932us/step - loss: 0.5045 - accuracy: 0.7971 - val_loss: 0.5063 - val_accuracy: 0.7964
Epoch 39/100
239/239 [==============================] - 0s 947us/step - loss: 0.5043 - accuracy: 0.7971 - val_loss: 0.5061 - val_accuracy: 0.7964
Epoch 40/100
239/239 [==============================] - 0s 933us/step - loss: 0.5051 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 41/100
239/239 [==============================] - 0s 900us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5055 - val_accuracy: 0.7964
Epoch 42/100
239/239 [==============================] - 0s 899us/step - loss: 0.5051 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 43/100
239/239 [==============================] - 0s 908us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5064 - val_accuracy: 0.7964
Epoch 44/100
239/239 [==============================] - 0s 894us/step - loss: 0.5049 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 45/100
239/239 [==============================] - 0s 921us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 46/100
239/239 [==============================] - 0s 1ms/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 47/100
239/239 [==============================] - 0s 906us/step - loss: 0.5049 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 48/100
239/239 [==============================] - 0s 924us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 49/100
239/239 [==============================] - 0s 894us/step - loss: 0.5049 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 50/100
239/239 [==============================] - 0s 895us/step - loss: 0.5051 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 51/100
239/239 [==============================] - 0s 994us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 52/100
239/239 [==============================] - 0s 922us/step - loss: 0.5043 - accuracy: 0.7971 - val_loss: 0.5065 - val_accuracy: 0.7964
Epoch 53/100
239/239 [==============================] - 0s 947us/step - loss: 0.5041 - accuracy: 0.7971 - val_loss: 0.5074 - val_accuracy: 0.7964
Epoch 54/100
239/239 [==============================] - 0s 934us/step - loss: 0.5044 - accuracy: 0.7971 - val_loss: 0.5062 - val_accuracy: 0.7964
Epoch 55/100
239/239 [==============================] - 0s 920us/step - loss: 0.5046 - accuracy: 0.7971 - val_loss: 0.5057 - val_accuracy: 0.7964
Epoch 56/100
239/239 [==============================] - 0s 933us/step - loss: 0.5051 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 57/100
239/239 [==============================] - 0s 940us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 58/100
239/239 [==============================] - 0s 925us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 59/100
239/239 [==============================] - 0s 920us/step - loss: 0.5050 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 60/100
239/239 [==============================] - 0s 951us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5055 - val_accuracy: 0.7964
Epoch 61/100
239/239 [==============================] - 0s 939us/step - loss: 0.5050 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 62/100
239/239 [==============================] - 0s 889us/step - loss: 0.5046 - accuracy: 0.7971 - val_loss: 0.5062 - val_accuracy: 0.7964
Epoch 63/100
239/239 [==============================] - 0s 915us/step - loss: 0.5049 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 64/100
239/239 [==============================] - 0s 933us/step - loss: 0.5046 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 65/100
239/239 [==============================] - 0s 902us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 66/100
239/239 [==============================] - 0s 925us/step - loss: 0.5046 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 67/100
239/239 [==============================] - 0s 901us/step - loss: 0.5049 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 68/100
239/239 [==============================] - 0s 942us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 69/100
239/239 [==============================] - 0s 893us/step - loss: 0.5046 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 70/100
239/239 [==============================] - 0s 922us/step - loss: 0.5050 - accuracy: 0.7971 - val_loss: 0.5055 - val_accuracy: 0.7964
Epoch 71/100
239/239 [==============================] - 0s 888us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5055 - val_accuracy: 0.7964
Epoch 72/100
239/239 [==============================] - 0s 890us/step - loss: 0.5049 - accuracy: 0.7971 - val_loss: 0.5055 - val_accuracy: 0.7964
Epoch 73/100
239/239 [==============================] - 0s 918us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 74/100
239/239 [==============================] - 0s 937us/step - loss: 0.5049 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 75/100
239/239 [==============================] - 0s 915us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 76/100
239/239 [==============================] - 0s 885us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 77/100
239/239 [==============================] - 0s 913us/step - loss: 0.5050 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 78/100
239/239 [==============================] - 0s 921us/step - loss: 0.5050 - accuracy: 0.7971 - val_loss: 0.5055 - val_accuracy: 0.7964
Epoch 79/100
239/239 [==============================] - 0s 898us/step - loss: 0.5046 - accuracy: 0.7971 - val_loss: 0.5057 - val_accuracy: 0.7964
Epoch 80/100
239/239 [==============================] - 0s 935us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 81/100
239/239 [==============================] - 0s 960us/step - loss: 0.5045 - accuracy: 0.7971 - val_loss: 0.5064 - val_accuracy: 0.7964
Epoch 82/100
239/239 [==============================] - 0s 912us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5055 - val_accuracy: 0.7964
Epoch 83/100
239/239 [==============================] - 0s 985us/step - loss: 0.5051 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 84/100
239/239 [==============================] - 0s 999us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 85/100
239/239 [==============================] - 0s 974us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5056 - val_accuracy: 0.7964
Epoch 86/100
239/239 [==============================] - 0s 986us/step - loss: 0.5051 - accuracy: 0.7971 - val_loss: 0.5058 - val_accuracy: 0.7964
Epoch 87/100
239/239 [==============================] - 0s 933us/step - loss: 0.5053 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 88/100
239/239 [==============================] - 0s 900us/step - loss: 0.5046 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 89/100
239/239 [==============================] - 0s 925us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 90/100
239/239 [==============================] - 0s 952us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 91/100
239/239 [==============================] - 0s 969us/step - loss: 0.5046 - accuracy: 0.7971 - val_loss: 0.5055 - val_accuracy: 0.7964
Epoch 92/100
239/239 [==============================] - 0s 1ms/step - loss: 0.5050 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 93/100
239/239 [==============================] - 0s 986us/step - loss: 0.5045 - accuracy: 0.7971 - val_loss: 0.5061 - val_accuracy: 0.7964
Epoch 94/100
239/239 [==============================] - 0s 960us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 95/100
239/239 [==============================] - 0s 965us/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5055 - val_accuracy: 0.7964
Epoch 96/100
239/239 [==============================] - 0s 1ms/step - loss: 0.5047 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 97/100
239/239 [==============================] - 0s 1000us/step - loss: 0.5044 - accuracy: 0.7971 - val_loss: 0.5064 - val_accuracy: 0.7964
Epoch 98/100
239/239 [==============================] - 0s 980us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5054 - val_accuracy: 0.7964
Epoch 99/100
239/239 [==============================] - 0s 923us/step - loss: 0.5048 - accuracy: 0.7971 - val_loss: 0.5053 - val_accuracy: 0.7964
Epoch 100/100
239/239 [==============================] - 0s 925us/step - loss: 0.5046 - accuracy: 0.7971 - val_loss: 0.5055 - val_accuracy: 0.7964
In [341]:
plt.plot(history1.history['accuracy'])
plt.plot(history1.history['val_accuracy'])
plt.title('Accuracy vs Epochs')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='lower right')
plt.show()
In [342]:
from sklearn.metrics import roc_curve

from matplotlib import pyplot


# predict probabilities
yhat1 = model_1.predict(X_test)
# calculate roc curves
fpr, tpr, thresholds1 = roc_curve(Y_test, yhat1)
# calculate the g-mean for each threshold
gmeans1 = np.sqrt(tpr * (1-fpr))
# locate the index of the largest g-mean
ix = np.argmax(gmeans1)
print('Best Threshold=%f, G-Mean=%.3f' % (thresholds1[ix], gmeans1[ix]))
# plot the roc curve for the model
pyplot.plot([0,1], [0,1], linestyle='--', label='No Skill')
pyplot.plot(fpr, tpr, marker='.')
pyplot.scatter(fpr[ix], tpr[ix], marker='o', color='black', label='Best')
# axis labels
pyplot.xlabel('False Positive Rate')
pyplot.ylabel('True Positive Rate')
pyplot.legend()
# show the plot
pyplot.show()
60/60 [==============================] - 0s 534us/step
Best Threshold=0.210576, G-Mean=0.052

Observations¶

The Accuracy is a little low, and the loss is higher that I would like.

Also there is no ROC curve with means the model is not making useful distinctions between the positive and negative classes.

I'll try using the SMOTE technique to see if we can improve the preformance of the model.

In [347]:
# Splitting the dataset into the Training and Testing set.
from sklearn.preprocessing import MinMaxScaler

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.8, random_state = 42)


scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)


from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import SMOTE


# Fit SMOTE on train data(Synthetic Minority Oversampling Technique)
sm = SMOTE(sampling_strategy=0.3, k_neighbors=5, random_state=42)
X_train_over, y_train_over = sm.fit_resample(X_train, y_train)
In [348]:
print("Before OverSampling, count of label '1': {}".format(sum(y_train == 1)))
print("Before OverSampling, count of label '0': {} \n".format(sum(y_train == 0)))

print("After OverSampling, count of label '1': {}".format(sum(y_train_over == 1)))
print("After OverSampling, count of label '0': {} \n".format(sum(y_train_over == 0)))

print("After OverSampling, the shape of train_X: {}".format(X_train_over.shape))
print("After OverSampling, the shape of train_y: {} \n".format(y_train_over.shape))
Before OverSampling, count of label '1': 293
Before OverSampling, count of label '0': 983 

After OverSampling, count of label '1': 294
After OverSampling, count of label '0': 983 

After OverSampling, the shape of train_X: (1277, 20)
After OverSampling, the shape of train_y: (1277,) 

In [349]:
# to build logstic regression model
from sklearn.linear_model import LogisticRegression

# defining the model
model = LogisticRegression(random_state = 1)

# storing accuracy values of model for every fold in "results"
results = cross_val_score(model, X_train_over, y_train_over, cv=kfold, scoring='accuracy')
In [350]:
# let's see the value of accuracy for every fold
print(results)
[0.8046875  0.828125   0.8046875  0.8125     0.78125    0.7890625
 0.8359375  0.8503937  0.81102362 0.73228346]
In [351]:
# let's see the mean accuracy score
print("Accuracy: %.3f%% (%.3f%%)" % (results.mean()*100.0, results.std()*100.0))
Accuracy: 80.500% (3.123%)
In [ ]:
 
In [352]:
## Testing Ridge

from sklearn import preprocessing
# scale all the columns of the mpg_df. This will produce a numpy array
X_scaled = preprocessing.scale(X)
X_scaled = pd.DataFrame(X_scaled, columns=X.columns)  

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X_scaled, Y, test_size=0.30, random_state=1)

regression_model = LinearRegression()
regression_model.fit(X_train, y_train)

for idx, col_name in enumerate(X_train.columns):
    print("The coefficient for {} is {}".format(col_name, regression_model.coef_[idx]))


## testing Ridge

ridge = Ridge(alpha=.3)
ridge.fit(X_train,y_train)
print ("Ridge model:", (ridge.coef_))
The coefficient for CreditScore is -0.008971117344083611
The coefficient for Age is 0.14869161654253046
The coefficient for Tenure is -0.006380013185686983
The coefficient for NumOfProducts is 0.015185421704473677
The coefficient for HasCrCard is -0.0011717280833360355
The coefficient for IsActiveMember is -0.0753157074456723
The coefficient for Geography_France is -6144859348862.27
The coefficient for Geography_Germany is -6110012361544.077
The coefficient for Geography_Spain is -5005820242469.596
The coefficient for Gender_Female is -7912655137696.856
The coefficient for Gender_Male is -7912655137696.893
The coefficient for Balance_label_Balance: 0 - 100181 is 1722602530809.1484
The coefficient for Balance_label_Balance: 100181 - 119839 is 1722602530809.1687
The coefficient for Balance_label_Balance: 119829 - 139512 is 1722242643093.7964
The coefficient for Balance_label_Balance: 139512 - 250898 is 1722602530809.1594
The coefficient for EstimatedSalary_label_EstSalary: 11 - 41818 is -2236014114031.007
The coefficient for EstimatedSalary_label_EstSalary: 41818 - 80414 is -2235357310618.867
The coefficient for EstimatedSalary_label_EstSalary: 80414 - 120377 is -2236014114031.0103
The coefficient for EstimatedSalary_label_EstSalary: 120377 - 160494 is -2235357310618.863
The coefficient for EstimatedSalary_label_EstSalary: 160494 - 200000 is -2236014114031.0044
Ridge model: [-0.00839515  0.14859493 -0.00421388  0.01457446  0.0028065  -0.07344
 -0.0221343   0.03385334 -0.01414996  0.0213488  -0.0213488  -0.01076006
  0.00864288  0.00278185 -0.00066408  0.0007538  -0.00288343 -0.00304943
  0.00125549  0.00392309]
In [353]:
#Lasso

## testing lasso

lasso = Lasso(alpha=0.2)
lasso.fit(X_train,y_train)
print ("Lasso model:", (lasso.coef_))
Lasso model: [-0.  0. -0.  0.  0. -0. -0.  0. -0.  0. -0. -0.  0.  0. -0.  0. -0. -0.
  0.  0.]
In [354]:
## compare

print(regression_model.score(X_train, y_train))
print(regression_model.score(X_test, y_test))
0.18623169300464604
0.1470697705081333
In [355]:
print(ridge.score(X_train, y_train))
print(ridge.score(X_test, y_test))
0.18685243332145485
0.14621830343063857
In [356]:
print(lasso.score(X_train, y_train))
print(lasso.score(X_test, y_test))
0.0
-0.0006593610757554824
In [357]:
#### trying polynomials

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree = 3, interaction_only=True)
X_poly = poly.fit_transform(X_scaled)
X_train, X_test, y_train, y_test = train_test_split(X_poly, Y, test_size=0.30, random_state=1)
X_train.shape
Out[357]:
(4468, 1351)
In [358]:
regression_model.fit(X_train, y_train)
print(regression_model.coef_[0])
-1678885404694.8037
In [359]:
ridge = Ridge(alpha=.3)
ridge.fit(X_train,y_train)
print ("Ridge model:", (ridge.coef_))
Ridge model: [ 0.00000000e+00 -1.07527742e-03  3.80585075e-02 ...  1.21338685e-04
  3.83373919e-04 -6.71546807e-05]
In [360]:
print(ridge.score(X_train, y_train))
print(ridge.score(X_test, y_test))
0.33967512085526363
0.1053089928658163
In [361]:
#fitting the model
history=model_1.fit(X_train_over,y_train_over,batch_size=15,epochs=100,validation_split=0.2)
Epoch 1/100
69/69 [==============================] - 1s 3ms/step - loss: 0.5338 - accuracy: 0.7669 - val_loss: 0.4920 - val_accuracy: 0.7812
Epoch 2/100
69/69 [==============================] - 0s 1ms/step - loss: 0.5186 - accuracy: 0.7659 - val_loss: 0.4618 - val_accuracy: 0.7812
Epoch 3/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4932 - accuracy: 0.7689 - val_loss: 0.4525 - val_accuracy: 0.7852
Epoch 4/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4782 - accuracy: 0.7806 - val_loss: 0.4423 - val_accuracy: 0.8125
Epoch 5/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4817 - accuracy: 0.7698 - val_loss: 0.4407 - val_accuracy: 0.8242
Epoch 6/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4743 - accuracy: 0.7826 - val_loss: 0.4359 - val_accuracy: 0.8242
Epoch 7/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4550 - accuracy: 0.7875 - val_loss: 0.4279 - val_accuracy: 0.8164
Epoch 8/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4555 - accuracy: 0.7933 - val_loss: 0.4246 - val_accuracy: 0.8203
Epoch 9/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4331 - accuracy: 0.8031 - val_loss: 0.4205 - val_accuracy: 0.8203
Epoch 10/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4451 - accuracy: 0.8031 - val_loss: 0.4225 - val_accuracy: 0.8242
Epoch 11/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4438 - accuracy: 0.7992 - val_loss: 0.4203 - val_accuracy: 0.8281
Epoch 12/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4318 - accuracy: 0.8061 - val_loss: 0.4218 - val_accuracy: 0.8320
Epoch 13/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4236 - accuracy: 0.8227 - val_loss: 0.4180 - val_accuracy: 0.8203
Epoch 14/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4247 - accuracy: 0.8208 - val_loss: 0.4152 - val_accuracy: 0.8281
Epoch 15/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4224 - accuracy: 0.8198 - val_loss: 0.4202 - val_accuracy: 0.8203
Epoch 16/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4117 - accuracy: 0.8208 - val_loss: 0.4154 - val_accuracy: 0.8164
Epoch 17/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4027 - accuracy: 0.8217 - val_loss: 0.4100 - val_accuracy: 0.8203
Epoch 18/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4083 - accuracy: 0.8168 - val_loss: 0.4118 - val_accuracy: 0.8242
Epoch 19/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4117 - accuracy: 0.8168 - val_loss: 0.4141 - val_accuracy: 0.8164
Epoch 20/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4028 - accuracy: 0.8325 - val_loss: 0.4172 - val_accuracy: 0.8086
Epoch 21/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3991 - accuracy: 0.8198 - val_loss: 0.4161 - val_accuracy: 0.8203
Epoch 22/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3928 - accuracy: 0.8364 - val_loss: 0.4105 - val_accuracy: 0.8281
Epoch 23/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3888 - accuracy: 0.8296 - val_loss: 0.4154 - val_accuracy: 0.8164
Epoch 24/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3770 - accuracy: 0.8315 - val_loss: 0.4159 - val_accuracy: 0.8164
Epoch 25/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3877 - accuracy: 0.8355 - val_loss: 0.4118 - val_accuracy: 0.8203
Epoch 26/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3877 - accuracy: 0.8325 - val_loss: 0.4138 - val_accuracy: 0.8125
Epoch 27/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3881 - accuracy: 0.8462 - val_loss: 0.4194 - val_accuracy: 0.8164
Epoch 28/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3734 - accuracy: 0.8462 - val_loss: 0.4199 - val_accuracy: 0.8125
Epoch 29/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3852 - accuracy: 0.8315 - val_loss: 0.4188 - val_accuracy: 0.8125
Epoch 30/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3814 - accuracy: 0.8413 - val_loss: 0.4158 - val_accuracy: 0.8125
Epoch 31/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3737 - accuracy: 0.8384 - val_loss: 0.4148 - val_accuracy: 0.8203
Epoch 32/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3691 - accuracy: 0.8404 - val_loss: 0.4164 - val_accuracy: 0.8281
Epoch 33/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3653 - accuracy: 0.8364 - val_loss: 0.4194 - val_accuracy: 0.8164
Epoch 34/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3630 - accuracy: 0.8550 - val_loss: 0.4188 - val_accuracy: 0.8125
Epoch 35/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3740 - accuracy: 0.8443 - val_loss: 0.4209 - val_accuracy: 0.8086
Epoch 36/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3586 - accuracy: 0.8531 - val_loss: 0.4174 - val_accuracy: 0.8086
Epoch 37/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3653 - accuracy: 0.8433 - val_loss: 0.4271 - val_accuracy: 0.8008
Epoch 38/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3594 - accuracy: 0.8501 - val_loss: 0.4169 - val_accuracy: 0.8086
Epoch 39/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3578 - accuracy: 0.8599 - val_loss: 0.4215 - val_accuracy: 0.8125
Epoch 40/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3618 - accuracy: 0.8599 - val_loss: 0.4216 - val_accuracy: 0.8164
Epoch 41/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3598 - accuracy: 0.8472 - val_loss: 0.4207 - val_accuracy: 0.8242
Epoch 42/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3531 - accuracy: 0.8560 - val_loss: 0.4305 - val_accuracy: 0.7969
Epoch 43/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3459 - accuracy: 0.8570 - val_loss: 0.4280 - val_accuracy: 0.8125
Epoch 44/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3417 - accuracy: 0.8609 - val_loss: 0.4276 - val_accuracy: 0.8281
Epoch 45/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3412 - accuracy: 0.8609 - val_loss: 0.4245 - val_accuracy: 0.8203
Epoch 46/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3464 - accuracy: 0.8550 - val_loss: 0.4256 - val_accuracy: 0.8164
Epoch 47/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3411 - accuracy: 0.8727 - val_loss: 0.4186 - val_accuracy: 0.8203
Epoch 48/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3311 - accuracy: 0.8697 - val_loss: 0.4316 - val_accuracy: 0.8164
Epoch 49/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3309 - accuracy: 0.8658 - val_loss: 0.4386 - val_accuracy: 0.8086
Epoch 50/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3357 - accuracy: 0.8688 - val_loss: 0.4332 - val_accuracy: 0.8320
Epoch 51/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3234 - accuracy: 0.8746 - val_loss: 0.4371 - val_accuracy: 0.7969
Epoch 52/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3368 - accuracy: 0.8668 - val_loss: 0.4277 - val_accuracy: 0.8008
Epoch 53/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3308 - accuracy: 0.8707 - val_loss: 0.4309 - val_accuracy: 0.8086
Epoch 54/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3254 - accuracy: 0.8786 - val_loss: 0.4318 - val_accuracy: 0.8242
Epoch 55/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3352 - accuracy: 0.8658 - val_loss: 0.4356 - val_accuracy: 0.8086
Epoch 56/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3234 - accuracy: 0.8697 - val_loss: 0.4442 - val_accuracy: 0.8008
Epoch 57/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3307 - accuracy: 0.8639 - val_loss: 0.4389 - val_accuracy: 0.8203
Epoch 58/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3220 - accuracy: 0.8795 - val_loss: 0.4365 - val_accuracy: 0.8125
Epoch 59/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3291 - accuracy: 0.8697 - val_loss: 0.4403 - val_accuracy: 0.8086
Epoch 60/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3275 - accuracy: 0.8727 - val_loss: 0.4436 - val_accuracy: 0.8164
Epoch 61/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3128 - accuracy: 0.8717 - val_loss: 0.4542 - val_accuracy: 0.8008
Epoch 62/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3194 - accuracy: 0.8766 - val_loss: 0.4551 - val_accuracy: 0.7969
Epoch 63/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3048 - accuracy: 0.8795 - val_loss: 0.4552 - val_accuracy: 0.7969
Epoch 64/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3216 - accuracy: 0.8717 - val_loss: 0.4605 - val_accuracy: 0.8164
Epoch 65/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3073 - accuracy: 0.8786 - val_loss: 0.4638 - val_accuracy: 0.8047
Epoch 66/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3125 - accuracy: 0.8756 - val_loss: 0.4667 - val_accuracy: 0.8125
Epoch 67/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3114 - accuracy: 0.8786 - val_loss: 0.4631 - val_accuracy: 0.8164
Epoch 68/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3106 - accuracy: 0.8766 - val_loss: 0.4658 - val_accuracy: 0.7930
Epoch 69/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3185 - accuracy: 0.8776 - val_loss: 0.4628 - val_accuracy: 0.7969
Epoch 70/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3215 - accuracy: 0.8697 - val_loss: 0.4624 - val_accuracy: 0.7891
Epoch 71/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2972 - accuracy: 0.8864 - val_loss: 0.4591 - val_accuracy: 0.8164
Epoch 72/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2920 - accuracy: 0.8805 - val_loss: 0.4708 - val_accuracy: 0.7930
Epoch 73/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3172 - accuracy: 0.8639 - val_loss: 0.4647 - val_accuracy: 0.8008
Epoch 74/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3014 - accuracy: 0.8874 - val_loss: 0.4619 - val_accuracy: 0.7969
Epoch 75/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2933 - accuracy: 0.8981 - val_loss: 0.4635 - val_accuracy: 0.8164
Epoch 76/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3058 - accuracy: 0.8854 - val_loss: 0.4743 - val_accuracy: 0.7969
Epoch 77/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2889 - accuracy: 0.8942 - val_loss: 0.4687 - val_accuracy: 0.8125
Epoch 78/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2892 - accuracy: 0.8874 - val_loss: 0.4775 - val_accuracy: 0.7969
Epoch 79/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2867 - accuracy: 0.8854 - val_loss: 0.4870 - val_accuracy: 0.7891
Epoch 80/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2956 - accuracy: 0.8864 - val_loss: 0.4866 - val_accuracy: 0.7969
Epoch 81/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3032 - accuracy: 0.8883 - val_loss: 0.4668 - val_accuracy: 0.8047
Epoch 82/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2854 - accuracy: 0.8932 - val_loss: 0.4883 - val_accuracy: 0.7930
Epoch 83/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2761 - accuracy: 0.8972 - val_loss: 0.4827 - val_accuracy: 0.8086
Epoch 84/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2909 - accuracy: 0.8903 - val_loss: 0.4851 - val_accuracy: 0.8242
Epoch 85/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2785 - accuracy: 0.8883 - val_loss: 0.5055 - val_accuracy: 0.7891
Epoch 86/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2881 - accuracy: 0.9001 - val_loss: 0.5070 - val_accuracy: 0.7852
Epoch 87/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2774 - accuracy: 0.8942 - val_loss: 0.5080 - val_accuracy: 0.7891
Epoch 88/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2745 - accuracy: 0.8991 - val_loss: 0.4966 - val_accuracy: 0.8203
Epoch 89/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2812 - accuracy: 0.8913 - val_loss: 0.5183 - val_accuracy: 0.7930
Epoch 90/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2838 - accuracy: 0.8981 - val_loss: 0.4891 - val_accuracy: 0.8125
Epoch 91/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2820 - accuracy: 0.8972 - val_loss: 0.4982 - val_accuracy: 0.8125
Epoch 92/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2816 - accuracy: 0.8893 - val_loss: 0.4916 - val_accuracy: 0.8164
Epoch 93/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2922 - accuracy: 0.8923 - val_loss: 0.4832 - val_accuracy: 0.8125
Epoch 94/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2789 - accuracy: 0.8874 - val_loss: 0.5019 - val_accuracy: 0.7812
Epoch 95/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2767 - accuracy: 0.8903 - val_loss: 0.4940 - val_accuracy: 0.7852
Epoch 96/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2740 - accuracy: 0.8932 - val_loss: 0.5256 - val_accuracy: 0.7773
Epoch 97/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2639 - accuracy: 0.8991 - val_loss: 0.5100 - val_accuracy: 0.8047
Epoch 98/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2740 - accuracy: 0.9021 - val_loss: 0.5260 - val_accuracy: 0.7812
Epoch 99/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2751 - accuracy: 0.8932 - val_loss: 0.5153 - val_accuracy: 0.8008
Epoch 100/100
69/69 [==============================] - 0s 1ms/step - loss: 0.2649 - accuracy: 0.8991 - val_loss: 0.5069 - val_accuracy: 0.7891
In [362]:
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Accuracy vs Epochs')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='lower right')
plt.show()
In [363]:
# testing underfitting
# fit random under sampler on the train data
rus = RandomUnderSampler(random_state=1, sampling_strategy = 1)
X_train_un, y_train_un = rus.fit_resample(X_train, y_train)
In [364]:
print("Before Under Sampling, count of label '1': {}".format(sum(y_train == 1)))
print("Before Under Sampling, count of label '0': {} \n".format(sum(y_train == 0)))

print("After Under Sampling, count of label '1': {}".format(sum(y_train_un == 1)))
print("After Under Sampling, count of label '0': {} \n".format(sum(y_train_un == 0)))

print("After Under Sampling, the shape of train_X: {}".format(X_train_un.shape))
print("After Under Sampling, the shape of train_y: {} \n".format(y_train_un.shape))
Before Under Sampling, count of label '1': 1061
Before Under Sampling, count of label '0': 3407 

After Under Sampling, count of label '1': 1061
After Under Sampling, count of label '0': 1061 

After Under Sampling, the shape of train_X: (2122, 1351)
After Under Sampling, the shape of train_y: (2122,) 

In [365]:
# to build logstic regression model
from sklearn.linear_model import LogisticRegression

# defining the model
model = LogisticRegression(random_state = 1)

# storing accuracy values of model for every fold in "results"
results = cross_val_score(model, X_train_over, y_train_over, cv=kfold, scoring='accuracy')
In [366]:
# let's see the value of accuracy for every fold
print(results)
[0.8046875  0.828125   0.8046875  0.8125     0.78125    0.7890625
 0.8359375  0.8503937  0.81102362 0.73228346]
In [367]:
# let's see the mean accuracy score
print("Accuracy: %.3f%% (%.3f%%)" % (results.mean()*100.0, results.std()*100.0))
Accuracy: 80.500% (3.123%)
In [368]:
from sklearn import preprocessing
# scale all the columns of the mpg_df. This will produce a numpy array
X_scaled = preprocessing.scale(X)
X_scaled = pd.DataFrame(X_scaled, columns=X.columns)  

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X_scaled, Y, test_size=0.30, random_state=1)

regression_model = LinearRegression()
regression_model.fit(X_train, y_train)

for idx, col_name in enumerate(X_train.columns):
    print("The coefficient for {} is {}".format(col_name, regression_model.coef_[idx]))
The coefficient for CreditScore is -0.008971117344083611
The coefficient for Age is 0.14869161654253046
The coefficient for Tenure is -0.006380013185686983
The coefficient for NumOfProducts is 0.015185421704473677
The coefficient for HasCrCard is -0.0011717280833360355
The coefficient for IsActiveMember is -0.0753157074456723
The coefficient for Geography_France is -6144859348862.27
The coefficient for Geography_Germany is -6110012361544.077
The coefficient for Geography_Spain is -5005820242469.596
The coefficient for Gender_Female is -7912655137696.856
The coefficient for Gender_Male is -7912655137696.893
The coefficient for Balance_label_Balance: 0 - 100181 is 1722602530809.1484
The coefficient for Balance_label_Balance: 100181 - 119839 is 1722602530809.1687
The coefficient for Balance_label_Balance: 119829 - 139512 is 1722242643093.7964
The coefficient for Balance_label_Balance: 139512 - 250898 is 1722602530809.1594
The coefficient for EstimatedSalary_label_EstSalary: 11 - 41818 is -2236014114031.007
The coefficient for EstimatedSalary_label_EstSalary: 41818 - 80414 is -2235357310618.867
The coefficient for EstimatedSalary_label_EstSalary: 80414 - 120377 is -2236014114031.0103
The coefficient for EstimatedSalary_label_EstSalary: 120377 - 160494 is -2235357310618.863
The coefficient for EstimatedSalary_label_EstSalary: 160494 - 200000 is -2236014114031.0044
In [372]:
ridge = Ridge(alpha=.3)
ridge.fit(X_train,y_train)
lasso = Lasso(alpha=0.3)
lasso.fit(X_train,y_train)

print("Ridge Train", ridge.score(X_train, y_train))
print("Ridge Test", ridge.score(X_test, y_test))
print("Lasso Train", lasso.score(X_train, y_train))
print("Lasso Test", lasso.score(X_test, y_test))
Ridge Train 0.18685243332145485
Ridge Test 0.14621830343063857
Lasso Train 0.0
Lasso Test -0.0006593610757554824
In [379]:
#Model #1

#initialize the model
model_1 = Sequential()
# This adds the input layer (by specifying input dimension) AND the first hidden layer (units)
#units below is the number of neurons in the dense layer
model_1.add(Dense(units=16, input_dim = 20,activation='relu'))   # input of 10 columns as shown above
# hidden layer
model_1.add(Dense(units=24,activation='relu'))
#Adding Dropout to prevent overfitting 
model_1.add(Dropout(0.5))
model_1.add(Dense(24,activation='relu'))
model_1.add(Dense(24,activation='relu'))
# Adding the output layer
# Notice that we do not need to specify input dim. 
# we have an output of 1 node, which is the the desired dimensions of our output (fraud or not)
# We use the sigmoid because we want probability outcomes
model_1.add(Dense(1,activation='sigmoid')) 
# Create optimizer with default learning rate
# Compile the model
model_1.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
In [380]:
#fitting the model
history1=model_1.fit(X_train_over,y_train_over,batch_size=15,epochs=100,validation_split=0.2)
Epoch 1/100
69/69 [==============================] - 1s 3ms/step - loss: 0.6036 - accuracy: 0.7336 - val_loss: 0.5197 - val_accuracy: 0.7812
Epoch 2/100
69/69 [==============================] - 0s 1ms/step - loss: 0.5354 - accuracy: 0.7669 - val_loss: 0.5054 - val_accuracy: 0.7812
Epoch 3/100
69/69 [==============================] - 0s 1ms/step - loss: 0.5240 - accuracy: 0.7669 - val_loss: 0.5024 - val_accuracy: 0.7812
Epoch 4/100
69/69 [==============================] - 0s 1ms/step - loss: 0.5234 - accuracy: 0.7669 - val_loss: 0.5052 - val_accuracy: 0.7812
Epoch 5/100
69/69 [==============================] - 0s 1ms/step - loss: 0.5104 - accuracy: 0.7669 - val_loss: 0.4880 - val_accuracy: 0.7812
Epoch 6/100
69/69 [==============================] - 0s 1ms/step - loss: 0.5109 - accuracy: 0.7669 - val_loss: 0.4920 - val_accuracy: 0.7812
Epoch 7/100
69/69 [==============================] - 0s 1ms/step - loss: 0.5064 - accuracy: 0.7669 - val_loss: 0.4731 - val_accuracy: 0.7812
Epoch 8/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4965 - accuracy: 0.7669 - val_loss: 0.4628 - val_accuracy: 0.7812
Epoch 9/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4909 - accuracy: 0.7669 - val_loss: 0.4733 - val_accuracy: 0.7812
Epoch 10/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4976 - accuracy: 0.7669 - val_loss: 0.4559 - val_accuracy: 0.7812
Epoch 11/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4913 - accuracy: 0.7669 - val_loss: 0.4522 - val_accuracy: 0.7812
Epoch 12/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4824 - accuracy: 0.7669 - val_loss: 0.4544 - val_accuracy: 0.7812
Epoch 13/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4794 - accuracy: 0.7669 - val_loss: 0.4558 - val_accuracy: 0.7812
Epoch 14/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4777 - accuracy: 0.7669 - val_loss: 0.4425 - val_accuracy: 0.7930
Epoch 15/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4765 - accuracy: 0.7757 - val_loss: 0.4455 - val_accuracy: 0.8164
Epoch 16/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4665 - accuracy: 0.7855 - val_loss: 0.4435 - val_accuracy: 0.8203
Epoch 17/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4617 - accuracy: 0.7904 - val_loss: 0.4437 - val_accuracy: 0.8164
Epoch 18/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4605 - accuracy: 0.7904 - val_loss: 0.4419 - val_accuracy: 0.8203
Epoch 19/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4615 - accuracy: 0.8031 - val_loss: 0.4548 - val_accuracy: 0.8086
Epoch 20/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4465 - accuracy: 0.8041 - val_loss: 0.4408 - val_accuracy: 0.8086
Epoch 21/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4517 - accuracy: 0.7914 - val_loss: 0.4432 - val_accuracy: 0.8086
Epoch 22/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4455 - accuracy: 0.7982 - val_loss: 0.4407 - val_accuracy: 0.8164
Epoch 23/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4423 - accuracy: 0.8129 - val_loss: 0.4389 - val_accuracy: 0.8008
Epoch 24/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4408 - accuracy: 0.8071 - val_loss: 0.4494 - val_accuracy: 0.7773
Epoch 25/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4441 - accuracy: 0.8080 - val_loss: 0.4605 - val_accuracy: 0.7852
Epoch 26/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4390 - accuracy: 0.8051 - val_loss: 0.4701 - val_accuracy: 0.7734
Epoch 27/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4407 - accuracy: 0.8198 - val_loss: 0.4766 - val_accuracy: 0.7891
Epoch 28/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4249 - accuracy: 0.8208 - val_loss: 0.4578 - val_accuracy: 0.7812
Epoch 29/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4168 - accuracy: 0.8306 - val_loss: 0.4604 - val_accuracy: 0.7617
Epoch 30/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4093 - accuracy: 0.8286 - val_loss: 0.4607 - val_accuracy: 0.7812
Epoch 31/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4087 - accuracy: 0.8325 - val_loss: 0.4562 - val_accuracy: 0.7656
Epoch 32/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4242 - accuracy: 0.8208 - val_loss: 0.4659 - val_accuracy: 0.7852
Epoch 33/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4078 - accuracy: 0.8325 - val_loss: 0.4672 - val_accuracy: 0.7891
Epoch 34/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4156 - accuracy: 0.8247 - val_loss: 0.4605 - val_accuracy: 0.7656
Epoch 35/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3966 - accuracy: 0.8492 - val_loss: 0.4835 - val_accuracy: 0.7656
Epoch 36/100
69/69 [==============================] - 0s 1ms/step - loss: 0.4063 - accuracy: 0.8345 - val_loss: 0.4697 - val_accuracy: 0.7812
Epoch 37/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3906 - accuracy: 0.8394 - val_loss: 0.4965 - val_accuracy: 0.7578
Epoch 38/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3948 - accuracy: 0.8345 - val_loss: 0.4772 - val_accuracy: 0.7812
Epoch 39/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3937 - accuracy: 0.8335 - val_loss: 0.4830 - val_accuracy: 0.7852
Epoch 40/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3871 - accuracy: 0.8345 - val_loss: 0.4736 - val_accuracy: 0.7734
Epoch 41/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3845 - accuracy: 0.8404 - val_loss: 0.4722 - val_accuracy: 0.7812
Epoch 42/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3855 - accuracy: 0.8394 - val_loss: 0.5015 - val_accuracy: 0.7656
Epoch 43/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3777 - accuracy: 0.8521 - val_loss: 0.4943 - val_accuracy: 0.7617
Epoch 44/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3810 - accuracy: 0.8462 - val_loss: 0.4929 - val_accuracy: 0.7578
Epoch 45/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3732 - accuracy: 0.8590 - val_loss: 0.4939 - val_accuracy: 0.7578
Epoch 46/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3636 - accuracy: 0.8492 - val_loss: 0.5174 - val_accuracy: 0.7539
Epoch 47/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3747 - accuracy: 0.8423 - val_loss: 0.5008 - val_accuracy: 0.7656
Epoch 48/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3755 - accuracy: 0.8501 - val_loss: 0.5053 - val_accuracy: 0.7617
Epoch 49/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3740 - accuracy: 0.8443 - val_loss: 0.5179 - val_accuracy: 0.7578
Epoch 50/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3743 - accuracy: 0.8472 - val_loss: 0.4975 - val_accuracy: 0.7812
Epoch 51/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3711 - accuracy: 0.8501 - val_loss: 0.5189 - val_accuracy: 0.7617
Epoch 52/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3674 - accuracy: 0.8521 - val_loss: 0.5322 - val_accuracy: 0.7617
Epoch 53/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3533 - accuracy: 0.8560 - val_loss: 0.5147 - val_accuracy: 0.7695
Epoch 54/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3660 - accuracy: 0.8433 - val_loss: 0.5300 - val_accuracy: 0.7656
Epoch 55/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3714 - accuracy: 0.8452 - val_loss: 0.5133 - val_accuracy: 0.7734
Epoch 56/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3728 - accuracy: 0.8521 - val_loss: 0.5336 - val_accuracy: 0.7695
Epoch 57/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3691 - accuracy: 0.8511 - val_loss: 0.5331 - val_accuracy: 0.7578
Epoch 58/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3637 - accuracy: 0.8531 - val_loss: 0.5117 - val_accuracy: 0.7695
Epoch 59/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3635 - accuracy: 0.8531 - val_loss: 0.5223 - val_accuracy: 0.7656
Epoch 60/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3621 - accuracy: 0.8482 - val_loss: 0.5249 - val_accuracy: 0.7578
Epoch 61/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3496 - accuracy: 0.8560 - val_loss: 0.5357 - val_accuracy: 0.7578
Epoch 62/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3595 - accuracy: 0.8511 - val_loss: 0.5520 - val_accuracy: 0.7422
Epoch 63/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3620 - accuracy: 0.8550 - val_loss: 0.5449 - val_accuracy: 0.7539
Epoch 64/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3561 - accuracy: 0.8560 - val_loss: 0.5283 - val_accuracy: 0.7617
Epoch 65/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3373 - accuracy: 0.8668 - val_loss: 0.5479 - val_accuracy: 0.7539
Epoch 66/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3587 - accuracy: 0.8580 - val_loss: 0.5448 - val_accuracy: 0.7617
Epoch 67/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3531 - accuracy: 0.8590 - val_loss: 0.5302 - val_accuracy: 0.7617
Epoch 68/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3418 - accuracy: 0.8648 - val_loss: 0.5436 - val_accuracy: 0.7656
Epoch 69/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3347 - accuracy: 0.8648 - val_loss: 0.5401 - val_accuracy: 0.7500
Epoch 70/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3357 - accuracy: 0.8668 - val_loss: 0.5524 - val_accuracy: 0.7461
Epoch 71/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3511 - accuracy: 0.8599 - val_loss: 0.5517 - val_accuracy: 0.7461
Epoch 72/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3364 - accuracy: 0.8737 - val_loss: 0.5572 - val_accuracy: 0.7539
Epoch 73/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3418 - accuracy: 0.8560 - val_loss: 0.5581 - val_accuracy: 0.7656
Epoch 74/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3387 - accuracy: 0.8580 - val_loss: 0.5664 - val_accuracy: 0.7695
Epoch 75/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3323 - accuracy: 0.8639 - val_loss: 0.5745 - val_accuracy: 0.7461
Epoch 76/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3390 - accuracy: 0.8648 - val_loss: 0.5686 - val_accuracy: 0.7578
Epoch 77/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3370 - accuracy: 0.8668 - val_loss: 0.5581 - val_accuracy: 0.7656
Epoch 78/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3196 - accuracy: 0.8727 - val_loss: 0.5832 - val_accuracy: 0.7539
Epoch 79/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3369 - accuracy: 0.8697 - val_loss: 0.5641 - val_accuracy: 0.7539
Epoch 80/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3249 - accuracy: 0.8668 - val_loss: 0.5819 - val_accuracy: 0.7578
Epoch 81/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3368 - accuracy: 0.8629 - val_loss: 0.5861 - val_accuracy: 0.7578
Epoch 82/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3266 - accuracy: 0.8746 - val_loss: 0.5907 - val_accuracy: 0.7617
Epoch 83/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3270 - accuracy: 0.8697 - val_loss: 0.5972 - val_accuracy: 0.7539
Epoch 84/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3284 - accuracy: 0.8737 - val_loss: 0.5787 - val_accuracy: 0.7656
Epoch 85/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3284 - accuracy: 0.8697 - val_loss: 0.6035 - val_accuracy: 0.7500
Epoch 86/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3302 - accuracy: 0.8668 - val_loss: 0.5842 - val_accuracy: 0.7539
Epoch 87/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3099 - accuracy: 0.8795 - val_loss: 0.6017 - val_accuracy: 0.7656
Epoch 88/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3242 - accuracy: 0.8717 - val_loss: 0.5941 - val_accuracy: 0.7617
Epoch 89/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3109 - accuracy: 0.8854 - val_loss: 0.6230 - val_accuracy: 0.7656
Epoch 90/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3231 - accuracy: 0.8756 - val_loss: 0.5932 - val_accuracy: 0.7656
Epoch 91/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3164 - accuracy: 0.8737 - val_loss: 0.6060 - val_accuracy: 0.7656
Epoch 92/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3189 - accuracy: 0.8776 - val_loss: 0.5982 - val_accuracy: 0.7695
Epoch 93/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3162 - accuracy: 0.8766 - val_loss: 0.5982 - val_accuracy: 0.7812
Epoch 94/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3161 - accuracy: 0.8786 - val_loss: 0.5909 - val_accuracy: 0.7812
Epoch 95/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3112 - accuracy: 0.8737 - val_loss: 0.5961 - val_accuracy: 0.7617
Epoch 96/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3216 - accuracy: 0.8717 - val_loss: 0.5810 - val_accuracy: 0.7773
Epoch 97/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3098 - accuracy: 0.8815 - val_loss: 0.5992 - val_accuracy: 0.7617
Epoch 98/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3021 - accuracy: 0.8756 - val_loss: 0.5987 - val_accuracy: 0.7578
Epoch 99/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3078 - accuracy: 0.8746 - val_loss: 0.6213 - val_accuracy: 0.7656
Epoch 100/100
69/69 [==============================] - 0s 1ms/step - loss: 0.3119 - accuracy: 0.8776 - val_loss: 0.6104 - val_accuracy: 0.7656
In [382]:
plt.plot(history1.history['accuracy'])
plt.plot(history1.history['val_accuracy'])
plt.title('Accuracy vs Epochs')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='lower right')
plt.show()
In [383]:
#Model #2

from keras.layers import Dense, Dropout
from keras.regularizers import l2
from keras.optimizers import Adam

model_2 = Sequential()
model_2.add(Dense(units=32, input_dim=20, activation='relu', kernel_regularizer=l2(0.01)))
model_2.add(Dense(units=64, activation='relu', kernel_regularizer=l2(0.01)))
model_2.add(Dropout(0.5))
model_2.add(Dense(units=64, activation='relu', kernel_regularizer=l2(0.01)))
model_2.add(Dense(units=64, activation='relu', kernel_regularizer=l2(0.01)))
model_2.add(Dense(1, activation='sigmoid'))

# Compile the model with a custom optimizer and learning rate
optimizer = Adam(learning_rate=0.001)
model_2.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])
In [385]:
#fitting the model
history2=model_2.fit(X_train,y_train,batch_size=15,epochs=100,validation_split=0.2)
Epoch 1/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4655 - accuracy: 0.8344 - val_loss: 0.4737 - val_accuracy: 0.8356
Epoch 2/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4571 - accuracy: 0.8321 - val_loss: 0.4774 - val_accuracy: 0.8378
Epoch 3/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4566 - accuracy: 0.8369 - val_loss: 0.4732 - val_accuracy: 0.8255
Epoch 4/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4592 - accuracy: 0.8366 - val_loss: 0.4703 - val_accuracy: 0.8266
Epoch 5/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4527 - accuracy: 0.8397 - val_loss: 0.4700 - val_accuracy: 0.8389
Epoch 6/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4471 - accuracy: 0.8380 - val_loss: 0.4749 - val_accuracy: 0.8177
Epoch 7/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4504 - accuracy: 0.8369 - val_loss: 0.4661 - val_accuracy: 0.8322
Epoch 8/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4506 - accuracy: 0.8369 - val_loss: 0.4679 - val_accuracy: 0.8255
Epoch 9/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4466 - accuracy: 0.8428 - val_loss: 0.4647 - val_accuracy: 0.8277
Epoch 10/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4483 - accuracy: 0.8405 - val_loss: 0.4658 - val_accuracy: 0.8289
Epoch 11/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4448 - accuracy: 0.8425 - val_loss: 0.4583 - val_accuracy: 0.8300
Epoch 12/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4410 - accuracy: 0.8444 - val_loss: 0.4587 - val_accuracy: 0.8300
Epoch 13/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4464 - accuracy: 0.8386 - val_loss: 0.4690 - val_accuracy: 0.8300
Epoch 14/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4436 - accuracy: 0.8391 - val_loss: 0.4795 - val_accuracy: 0.8031
Epoch 15/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4469 - accuracy: 0.8397 - val_loss: 0.4571 - val_accuracy: 0.8311
Epoch 16/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4417 - accuracy: 0.8425 - val_loss: 0.4642 - val_accuracy: 0.8322
Epoch 17/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4362 - accuracy: 0.8411 - val_loss: 0.4514 - val_accuracy: 0.8356
Epoch 18/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4413 - accuracy: 0.8366 - val_loss: 0.4615 - val_accuracy: 0.8389
Epoch 19/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4444 - accuracy: 0.8411 - val_loss: 0.4567 - val_accuracy: 0.8356
Epoch 20/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4391 - accuracy: 0.8369 - val_loss: 0.4548 - val_accuracy: 0.8378
Epoch 21/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4377 - accuracy: 0.8444 - val_loss: 0.4594 - val_accuracy: 0.8177
Epoch 22/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4429 - accuracy: 0.8436 - val_loss: 0.4557 - val_accuracy: 0.8277
Epoch 23/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4352 - accuracy: 0.8453 - val_loss: 0.4564 - val_accuracy: 0.8345
Epoch 24/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4354 - accuracy: 0.8408 - val_loss: 0.4780 - val_accuracy: 0.8177
Epoch 25/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4439 - accuracy: 0.8456 - val_loss: 0.4519 - val_accuracy: 0.8322
Epoch 26/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4398 - accuracy: 0.8383 - val_loss: 0.4521 - val_accuracy: 0.8322
Epoch 27/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4387 - accuracy: 0.8383 - val_loss: 0.4599 - val_accuracy: 0.8333
Epoch 28/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4343 - accuracy: 0.8419 - val_loss: 0.4666 - val_accuracy: 0.8277
Epoch 29/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4375 - accuracy: 0.8428 - val_loss: 0.4565 - val_accuracy: 0.8277
Epoch 30/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4362 - accuracy: 0.8408 - val_loss: 0.4540 - val_accuracy: 0.8255
Epoch 31/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4368 - accuracy: 0.8456 - val_loss: 0.4610 - val_accuracy: 0.8333
Epoch 32/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4373 - accuracy: 0.8397 - val_loss: 0.4534 - val_accuracy: 0.8311
Epoch 33/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4317 - accuracy: 0.8442 - val_loss: 0.4630 - val_accuracy: 0.8311
Epoch 34/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4328 - accuracy: 0.8428 - val_loss: 0.4723 - val_accuracy: 0.8132
Epoch 35/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4345 - accuracy: 0.8419 - val_loss: 0.4541 - val_accuracy: 0.8266
Epoch 36/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4385 - accuracy: 0.8450 - val_loss: 0.4525 - val_accuracy: 0.8389
Epoch 37/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4359 - accuracy: 0.8411 - val_loss: 0.4561 - val_accuracy: 0.8322
Epoch 38/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4358 - accuracy: 0.8383 - val_loss: 0.4489 - val_accuracy: 0.8378
Epoch 39/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4319 - accuracy: 0.8450 - val_loss: 0.4692 - val_accuracy: 0.8367
Epoch 40/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4362 - accuracy: 0.8450 - val_loss: 0.4558 - val_accuracy: 0.8277
Epoch 41/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4326 - accuracy: 0.8458 - val_loss: 0.4498 - val_accuracy: 0.8356
Epoch 42/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4343 - accuracy: 0.8411 - val_loss: 0.4491 - val_accuracy: 0.8345
Epoch 43/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4315 - accuracy: 0.8388 - val_loss: 0.4528 - val_accuracy: 0.8210
Epoch 44/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4325 - accuracy: 0.8439 - val_loss: 0.4630 - val_accuracy: 0.8244
Epoch 45/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4325 - accuracy: 0.8397 - val_loss: 0.4586 - val_accuracy: 0.8289
Epoch 46/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4316 - accuracy: 0.8444 - val_loss: 0.4546 - val_accuracy: 0.8255
Epoch 47/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4334 - accuracy: 0.8461 - val_loss: 0.4601 - val_accuracy: 0.8199
Epoch 48/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4312 - accuracy: 0.8458 - val_loss: 0.4556 - val_accuracy: 0.8289
Epoch 49/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4314 - accuracy: 0.8458 - val_loss: 0.4511 - val_accuracy: 0.8255
Epoch 50/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4319 - accuracy: 0.8461 - val_loss: 0.4516 - val_accuracy: 0.8244
Epoch 51/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4309 - accuracy: 0.8408 - val_loss: 0.4523 - val_accuracy: 0.8311
Epoch 52/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4289 - accuracy: 0.8419 - val_loss: 0.4610 - val_accuracy: 0.8300
Epoch 53/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4274 - accuracy: 0.8428 - val_loss: 0.4506 - val_accuracy: 0.8333
Epoch 54/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4280 - accuracy: 0.8442 - val_loss: 0.4704 - val_accuracy: 0.8289
Epoch 55/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4315 - accuracy: 0.8402 - val_loss: 0.4641 - val_accuracy: 0.8333
Epoch 56/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4291 - accuracy: 0.8422 - val_loss: 0.4490 - val_accuracy: 0.8199
Epoch 57/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4291 - accuracy: 0.8444 - val_loss: 0.4564 - val_accuracy: 0.8300
Epoch 58/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4311 - accuracy: 0.8425 - val_loss: 0.4523 - val_accuracy: 0.8266
Epoch 59/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4282 - accuracy: 0.8430 - val_loss: 0.4520 - val_accuracy: 0.8199
Epoch 60/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4261 - accuracy: 0.8497 - val_loss: 0.4520 - val_accuracy: 0.8333
Epoch 61/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4276 - accuracy: 0.8402 - val_loss: 0.4584 - val_accuracy: 0.8221
Epoch 62/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4253 - accuracy: 0.8439 - val_loss: 0.4532 - val_accuracy: 0.8311
Epoch 63/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4325 - accuracy: 0.8414 - val_loss: 0.4562 - val_accuracy: 0.8266
Epoch 64/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4260 - accuracy: 0.8444 - val_loss: 0.4461 - val_accuracy: 0.8345
Epoch 65/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4252 - accuracy: 0.8464 - val_loss: 0.4550 - val_accuracy: 0.8210
Epoch 66/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4290 - accuracy: 0.8442 - val_loss: 0.4565 - val_accuracy: 0.8345
Epoch 67/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4249 - accuracy: 0.8458 - val_loss: 0.4498 - val_accuracy: 0.8367
Epoch 68/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4320 - accuracy: 0.8380 - val_loss: 0.4540 - val_accuracy: 0.8255
Epoch 69/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4222 - accuracy: 0.8444 - val_loss: 0.4512 - val_accuracy: 0.8233
Epoch 70/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4266 - accuracy: 0.8461 - val_loss: 0.4516 - val_accuracy: 0.8154
Epoch 71/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4247 - accuracy: 0.8478 - val_loss: 0.4484 - val_accuracy: 0.8311
Epoch 72/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4262 - accuracy: 0.8414 - val_loss: 0.4539 - val_accuracy: 0.8277
Epoch 73/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4278 - accuracy: 0.8380 - val_loss: 0.4504 - val_accuracy: 0.8244
Epoch 74/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4279 - accuracy: 0.8492 - val_loss: 0.4542 - val_accuracy: 0.8289
Epoch 75/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4283 - accuracy: 0.8461 - val_loss: 0.4472 - val_accuracy: 0.8244
Epoch 76/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4264 - accuracy: 0.8411 - val_loss: 0.4562 - val_accuracy: 0.8277
Epoch 77/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4271 - accuracy: 0.8470 - val_loss: 0.4457 - val_accuracy: 0.8266
Epoch 78/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4284 - accuracy: 0.8430 - val_loss: 0.4573 - val_accuracy: 0.8143
Epoch 79/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4239 - accuracy: 0.8430 - val_loss: 0.4610 - val_accuracy: 0.8210
Epoch 80/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4233 - accuracy: 0.8458 - val_loss: 0.4498 - val_accuracy: 0.8345
Epoch 81/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4287 - accuracy: 0.8467 - val_loss: 0.4640 - val_accuracy: 0.8121
Epoch 82/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4238 - accuracy: 0.8425 - val_loss: 0.4498 - val_accuracy: 0.8322
Epoch 83/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4259 - accuracy: 0.8374 - val_loss: 0.4545 - val_accuracy: 0.8221
Epoch 84/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4304 - accuracy: 0.8428 - val_loss: 0.4605 - val_accuracy: 0.8300
Epoch 85/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4268 - accuracy: 0.8419 - val_loss: 0.4553 - val_accuracy: 0.8300
Epoch 86/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4220 - accuracy: 0.8497 - val_loss: 0.4534 - val_accuracy: 0.8244
Epoch 87/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4234 - accuracy: 0.8447 - val_loss: 0.4565 - val_accuracy: 0.8244
Epoch 88/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4231 - accuracy: 0.8425 - val_loss: 0.4556 - val_accuracy: 0.8289
Epoch 89/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4266 - accuracy: 0.8433 - val_loss: 0.4514 - val_accuracy: 0.8266
Epoch 90/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4230 - accuracy: 0.8411 - val_loss: 0.4535 - val_accuracy: 0.8255
Epoch 91/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4242 - accuracy: 0.8450 - val_loss: 0.4531 - val_accuracy: 0.8322
Epoch 92/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4248 - accuracy: 0.8450 - val_loss: 0.4580 - val_accuracy: 0.8210
Epoch 93/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4259 - accuracy: 0.8458 - val_loss: 0.4482 - val_accuracy: 0.8255
Epoch 94/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4236 - accuracy: 0.8453 - val_loss: 0.4583 - val_accuracy: 0.8289
Epoch 95/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4207 - accuracy: 0.8470 - val_loss: 0.4482 - val_accuracy: 0.8300
Epoch 96/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4210 - accuracy: 0.8419 - val_loss: 0.4493 - val_accuracy: 0.8300
Epoch 97/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4209 - accuracy: 0.8444 - val_loss: 0.4533 - val_accuracy: 0.8255
Epoch 98/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4251 - accuracy: 0.8447 - val_loss: 0.4492 - val_accuracy: 0.8277
Epoch 99/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4212 - accuracy: 0.8475 - val_loss: 0.4502 - val_accuracy: 0.8255
Epoch 100/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4206 - accuracy: 0.8442 - val_loss: 0.4537 - val_accuracy: 0.8300
In [386]:
plt.plot(history2.history['accuracy'])
plt.plot(history2.history['val_accuracy'])
plt.title('Accuracy vs Epochs')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='lower right')
plt.show()
In [414]:
#Model #3

#initialize the model
model_3 = Sequential()
# This adds the input layer (by specifying input dimension) AND the first hidden layer (units)
#units below is the number of neurons in the dense layer
model_3.add(Dense(units=12, input_dim = 20,activation='relu'))   # input of 10 columns as shown above
# hidden layer
model_3.add(Dense(units=12,activation='relu'))
#Adding Dropout to prevent overfitting 
model_3.add(Dropout(0.5))
model_3.add(Dense(16,activation='relu'))
model_3.add(Dense(16,activation='relu'))



# Adding the output layer
# Notice that we do not need to specify input dim. 
# we have an output of 1 node, which is the the desired dimensions of our output (fraud or not)
# We use the sigmoid because we want probability outcomes
model_3.add(Dense(1,activation='sigmoid'))  

# Create optimizer with default learning rate
# Compile the model
model_3.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
In [415]:
#fitting the model
history3=model_3.fit(X_train,y_train,batch_size=15,epochs=100,validation_split=0.2)
Epoch 1/100
239/239 [==============================] - 1s 2ms/step - loss: 0.5536 - accuracy: 0.7613 - val_loss: 0.5223 - val_accuracy: 0.7606
Epoch 2/100
239/239 [==============================] - 0s 1ms/step - loss: 0.5092 - accuracy: 0.7675 - val_loss: 0.5034 - val_accuracy: 0.7640
Epoch 3/100
239/239 [==============================] - 0s 930us/step - loss: 0.4923 - accuracy: 0.7711 - val_loss: 0.4925 - val_accuracy: 0.7673
Epoch 4/100
239/239 [==============================] - 0s 920us/step - loss: 0.4765 - accuracy: 0.7790 - val_loss: 0.4891 - val_accuracy: 0.7785
Epoch 5/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4675 - accuracy: 0.7871 - val_loss: 0.4808 - val_accuracy: 0.7852
Epoch 6/100
239/239 [==============================] - 0s 935us/step - loss: 0.4653 - accuracy: 0.7818 - val_loss: 0.4759 - val_accuracy: 0.7841
Epoch 7/100
239/239 [==============================] - 0s 930us/step - loss: 0.4620 - accuracy: 0.7832 - val_loss: 0.4727 - val_accuracy: 0.7886
Epoch 8/100
239/239 [==============================] - 0s 905us/step - loss: 0.4536 - accuracy: 0.7834 - val_loss: 0.4772 - val_accuracy: 0.7819
Epoch 9/100
239/239 [==============================] - 0s 908us/step - loss: 0.4539 - accuracy: 0.7848 - val_loss: 0.4681 - val_accuracy: 0.7864
Epoch 10/100
239/239 [==============================] - 0s 923us/step - loss: 0.4525 - accuracy: 0.7815 - val_loss: 0.4638 - val_accuracy: 0.7953
Epoch 11/100
239/239 [==============================] - 0s 980us/step - loss: 0.4425 - accuracy: 0.7941 - val_loss: 0.4653 - val_accuracy: 0.7919
Epoch 12/100
239/239 [==============================] - 0s 916us/step - loss: 0.4373 - accuracy: 0.7963 - val_loss: 0.4673 - val_accuracy: 0.7942
Epoch 13/100
239/239 [==============================] - 0s 909us/step - loss: 0.4357 - accuracy: 0.8123 - val_loss: 0.4584 - val_accuracy: 0.8098
Epoch 14/100
239/239 [==============================] - 0s 922us/step - loss: 0.4305 - accuracy: 0.8109 - val_loss: 0.4592 - val_accuracy: 0.8009
Epoch 15/100
239/239 [==============================] - 0s 974us/step - loss: 0.4266 - accuracy: 0.8170 - val_loss: 0.4548 - val_accuracy: 0.8098
Epoch 16/100
239/239 [==============================] - 0s 988us/step - loss: 0.4231 - accuracy: 0.8120 - val_loss: 0.4517 - val_accuracy: 0.8076
Epoch 17/100
239/239 [==============================] - 0s 948us/step - loss: 0.4218 - accuracy: 0.8125 - val_loss: 0.4495 - val_accuracy: 0.8132
Epoch 18/100
239/239 [==============================] - 0s 984us/step - loss: 0.4154 - accuracy: 0.8223 - val_loss: 0.4466 - val_accuracy: 0.8177
Epoch 19/100
239/239 [==============================] - 0s 947us/step - loss: 0.4131 - accuracy: 0.8215 - val_loss: 0.4379 - val_accuracy: 0.8098
Epoch 20/100
239/239 [==============================] - 0s 963us/step - loss: 0.4066 - accuracy: 0.8251 - val_loss: 0.4319 - val_accuracy: 0.8289
Epoch 21/100
239/239 [==============================] - 0s 907us/step - loss: 0.4044 - accuracy: 0.8296 - val_loss: 0.4283 - val_accuracy: 0.8289
Epoch 22/100
239/239 [==============================] - 0s 922us/step - loss: 0.4043 - accuracy: 0.8257 - val_loss: 0.4254 - val_accuracy: 0.8221
Epoch 23/100
239/239 [==============================] - 0s 926us/step - loss: 0.4054 - accuracy: 0.8262 - val_loss: 0.4317 - val_accuracy: 0.8221
Epoch 24/100
239/239 [==============================] - 0s 919us/step - loss: 0.3944 - accuracy: 0.8360 - val_loss: 0.4357 - val_accuracy: 0.8233
Epoch 25/100
239/239 [==============================] - 0s 914us/step - loss: 0.3949 - accuracy: 0.8338 - val_loss: 0.4381 - val_accuracy: 0.8244
Epoch 26/100
239/239 [==============================] - 0s 926us/step - loss: 0.3979 - accuracy: 0.8335 - val_loss: 0.4270 - val_accuracy: 0.8255
Epoch 27/100
239/239 [==============================] - 0s 914us/step - loss: 0.3939 - accuracy: 0.8330 - val_loss: 0.4270 - val_accuracy: 0.8266
Epoch 28/100
239/239 [==============================] - 0s 957us/step - loss: 0.3978 - accuracy: 0.8338 - val_loss: 0.4311 - val_accuracy: 0.8221
Epoch 29/100
239/239 [==============================] - 0s 928us/step - loss: 0.3880 - accuracy: 0.8414 - val_loss: 0.4196 - val_accuracy: 0.8356
Epoch 30/100
239/239 [==============================] - 0s 911us/step - loss: 0.3889 - accuracy: 0.8330 - val_loss: 0.4249 - val_accuracy: 0.8345
Epoch 31/100
239/239 [==============================] - 0s 938us/step - loss: 0.3927 - accuracy: 0.8374 - val_loss: 0.4225 - val_accuracy: 0.8367
Epoch 32/100
239/239 [==============================] - 0s 923us/step - loss: 0.3879 - accuracy: 0.8355 - val_loss: 0.4248 - val_accuracy: 0.8322
Epoch 33/100
239/239 [==============================] - 0s 888us/step - loss: 0.3856 - accuracy: 0.8380 - val_loss: 0.4196 - val_accuracy: 0.8400
Epoch 34/100
239/239 [==============================] - 0s 897us/step - loss: 0.3791 - accuracy: 0.8388 - val_loss: 0.4226 - val_accuracy: 0.8322
Epoch 35/100
239/239 [==============================] - 0s 944us/step - loss: 0.3830 - accuracy: 0.8394 - val_loss: 0.4196 - val_accuracy: 0.8356
Epoch 36/100
239/239 [==============================] - 0s 904us/step - loss: 0.3789 - accuracy: 0.8400 - val_loss: 0.4148 - val_accuracy: 0.8389
Epoch 37/100
239/239 [==============================] - 0s 890us/step - loss: 0.3801 - accuracy: 0.8433 - val_loss: 0.4163 - val_accuracy: 0.8356
Epoch 38/100
239/239 [==============================] - 0s 896us/step - loss: 0.3850 - accuracy: 0.8388 - val_loss: 0.4196 - val_accuracy: 0.8345
Epoch 39/100
239/239 [==============================] - 0s 884us/step - loss: 0.3767 - accuracy: 0.8481 - val_loss: 0.4130 - val_accuracy: 0.8333
Epoch 40/100
239/239 [==============================] - 0s 890us/step - loss: 0.3775 - accuracy: 0.8428 - val_loss: 0.4148 - val_accuracy: 0.8412
Epoch 41/100
239/239 [==============================] - 0s 884us/step - loss: 0.3724 - accuracy: 0.8456 - val_loss: 0.4297 - val_accuracy: 0.8356
Epoch 42/100
239/239 [==============================] - 0s 988us/step - loss: 0.3794 - accuracy: 0.8444 - val_loss: 0.4197 - val_accuracy: 0.8345
Epoch 43/100
239/239 [==============================] - 0s 883us/step - loss: 0.3818 - accuracy: 0.8386 - val_loss: 0.4271 - val_accuracy: 0.8300
Epoch 44/100
239/239 [==============================] - 0s 883us/step - loss: 0.3782 - accuracy: 0.8422 - val_loss: 0.4232 - val_accuracy: 0.8378
Epoch 45/100
239/239 [==============================] - 0s 975us/step - loss: 0.3777 - accuracy: 0.8481 - val_loss: 0.4356 - val_accuracy: 0.8311
Epoch 46/100
239/239 [==============================] - 0s 893us/step - loss: 0.3736 - accuracy: 0.8472 - val_loss: 0.4205 - val_accuracy: 0.8367
Epoch 47/100
239/239 [==============================] - 0s 901us/step - loss: 0.3733 - accuracy: 0.8461 - val_loss: 0.4162 - val_accuracy: 0.8345
Epoch 48/100
239/239 [==============================] - 0s 887us/step - loss: 0.3769 - accuracy: 0.8442 - val_loss: 0.4257 - val_accuracy: 0.8367
Epoch 49/100
239/239 [==============================] - 0s 888us/step - loss: 0.3763 - accuracy: 0.8439 - val_loss: 0.4178 - val_accuracy: 0.8389
Epoch 50/100
239/239 [==============================] - 0s 903us/step - loss: 0.3737 - accuracy: 0.8486 - val_loss: 0.4199 - val_accuracy: 0.8345
Epoch 51/100
239/239 [==============================] - 0s 893us/step - loss: 0.3703 - accuracy: 0.8483 - val_loss: 0.4251 - val_accuracy: 0.8356
Epoch 52/100
239/239 [==============================] - 0s 901us/step - loss: 0.3728 - accuracy: 0.8481 - val_loss: 0.4146 - val_accuracy: 0.8378
Epoch 53/100
239/239 [==============================] - 0s 883us/step - loss: 0.3681 - accuracy: 0.8514 - val_loss: 0.4169 - val_accuracy: 0.8322
Epoch 54/100
239/239 [==============================] - 0s 906us/step - loss: 0.3735 - accuracy: 0.8428 - val_loss: 0.4107 - val_accuracy: 0.8378
Epoch 55/100
239/239 [==============================] - 0s 909us/step - loss: 0.3717 - accuracy: 0.8492 - val_loss: 0.4156 - val_accuracy: 0.8356
Epoch 56/100
239/239 [==============================] - 0s 916us/step - loss: 0.3699 - accuracy: 0.8492 - val_loss: 0.4183 - val_accuracy: 0.8389
Epoch 57/100
239/239 [==============================] - 0s 905us/step - loss: 0.3650 - accuracy: 0.8528 - val_loss: 0.4203 - val_accuracy: 0.8311
Epoch 58/100
239/239 [==============================] - 0s 890us/step - loss: 0.3659 - accuracy: 0.8503 - val_loss: 0.4236 - val_accuracy: 0.8277
Epoch 59/100
239/239 [==============================] - 0s 912us/step - loss: 0.3685 - accuracy: 0.8514 - val_loss: 0.4257 - val_accuracy: 0.8322
Epoch 60/100
239/239 [==============================] - 0s 882us/step - loss: 0.3699 - accuracy: 0.8475 - val_loss: 0.4141 - val_accuracy: 0.8400
Epoch 61/100
239/239 [==============================] - 0s 889us/step - loss: 0.3657 - accuracy: 0.8503 - val_loss: 0.4143 - val_accuracy: 0.8412
Epoch 62/100
239/239 [==============================] - 0s 880us/step - loss: 0.3693 - accuracy: 0.8464 - val_loss: 0.4189 - val_accuracy: 0.8333
Epoch 63/100
239/239 [==============================] - 0s 885us/step - loss: 0.3740 - accuracy: 0.8456 - val_loss: 0.4218 - val_accuracy: 0.8434
Epoch 64/100
239/239 [==============================] - 0s 882us/step - loss: 0.3679 - accuracy: 0.8517 - val_loss: 0.4165 - val_accuracy: 0.8434
Epoch 65/100
239/239 [==============================] - 0s 891us/step - loss: 0.3684 - accuracy: 0.8450 - val_loss: 0.4230 - val_accuracy: 0.8423
Epoch 66/100
239/239 [==============================] - 0s 922us/step - loss: 0.3663 - accuracy: 0.8500 - val_loss: 0.4208 - val_accuracy: 0.8412
Epoch 67/100
239/239 [==============================] - 0s 894us/step - loss: 0.3672 - accuracy: 0.8492 - val_loss: 0.4108 - val_accuracy: 0.8412
Epoch 68/100
239/239 [==============================] - 0s 889us/step - loss: 0.3656 - accuracy: 0.8509 - val_loss: 0.4150 - val_accuracy: 0.8434
Epoch 69/100
239/239 [==============================] - 0s 912us/step - loss: 0.3608 - accuracy: 0.8548 - val_loss: 0.4190 - val_accuracy: 0.8300
Epoch 70/100
239/239 [==============================] - 0s 907us/step - loss: 0.3652 - accuracy: 0.8503 - val_loss: 0.4137 - val_accuracy: 0.8400
Epoch 71/100
239/239 [==============================] - 0s 887us/step - loss: 0.3666 - accuracy: 0.8475 - val_loss: 0.4287 - val_accuracy: 0.8356
Epoch 72/100
239/239 [==============================] - 0s 889us/step - loss: 0.3649 - accuracy: 0.8509 - val_loss: 0.4198 - val_accuracy: 0.8345
Epoch 73/100
239/239 [==============================] - 0s 885us/step - loss: 0.3631 - accuracy: 0.8559 - val_loss: 0.4174 - val_accuracy: 0.8367
Epoch 74/100
239/239 [==============================] - 0s 904us/step - loss: 0.3679 - accuracy: 0.8481 - val_loss: 0.4114 - val_accuracy: 0.8445
Epoch 75/100
239/239 [==============================] - 0s 921us/step - loss: 0.3598 - accuracy: 0.8539 - val_loss: 0.4127 - val_accuracy: 0.8378
Epoch 76/100
239/239 [==============================] - 0s 882us/step - loss: 0.3634 - accuracy: 0.8534 - val_loss: 0.4094 - val_accuracy: 0.8423
Epoch 77/100
239/239 [==============================] - 0s 887us/step - loss: 0.3625 - accuracy: 0.8548 - val_loss: 0.4116 - val_accuracy: 0.8412
Epoch 78/100
239/239 [==============================] - 0s 902us/step - loss: 0.3687 - accuracy: 0.8509 - val_loss: 0.4253 - val_accuracy: 0.8322
Epoch 79/100
239/239 [==============================] - 0s 898us/step - loss: 0.3609 - accuracy: 0.8528 - val_loss: 0.4155 - val_accuracy: 0.8356
Epoch 80/100
239/239 [==============================] - 0s 898us/step - loss: 0.3603 - accuracy: 0.8567 - val_loss: 0.4232 - val_accuracy: 0.8300
Epoch 81/100
239/239 [==============================] - 0s 888us/step - loss: 0.3645 - accuracy: 0.8509 - val_loss: 0.4211 - val_accuracy: 0.8378
Epoch 82/100
239/239 [==============================] - 0s 890us/step - loss: 0.3629 - accuracy: 0.8509 - val_loss: 0.4137 - val_accuracy: 0.8378
Epoch 83/100
239/239 [==============================] - 0s 897us/step - loss: 0.3633 - accuracy: 0.8497 - val_loss: 0.4190 - val_accuracy: 0.8378
Epoch 84/100
239/239 [==============================] - 0s 886us/step - loss: 0.3697 - accuracy: 0.8489 - val_loss: 0.4235 - val_accuracy: 0.8412
Epoch 85/100
239/239 [==============================] - 0s 884us/step - loss: 0.3619 - accuracy: 0.8539 - val_loss: 0.4254 - val_accuracy: 0.8311
Epoch 86/100
239/239 [==============================] - 0s 884us/step - loss: 0.3625 - accuracy: 0.8551 - val_loss: 0.4155 - val_accuracy: 0.8367
Epoch 87/100
239/239 [==============================] - 0s 884us/step - loss: 0.3642 - accuracy: 0.8545 - val_loss: 0.4164 - val_accuracy: 0.8378
Epoch 88/100
239/239 [==============================] - 0s 964us/step - loss: 0.3625 - accuracy: 0.8525 - val_loss: 0.4152 - val_accuracy: 0.8400
Epoch 89/100
239/239 [==============================] - 0s 962us/step - loss: 0.3629 - accuracy: 0.8531 - val_loss: 0.4155 - val_accuracy: 0.8345
Epoch 90/100
239/239 [==============================] - 0s 928us/step - loss: 0.3622 - accuracy: 0.8528 - val_loss: 0.4152 - val_accuracy: 0.8345
Epoch 91/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3619 - accuracy: 0.8497 - val_loss: 0.4216 - val_accuracy: 0.8345
Epoch 92/100
239/239 [==============================] - 0s 966us/step - loss: 0.3620 - accuracy: 0.8528 - val_loss: 0.4186 - val_accuracy: 0.8367
Epoch 93/100
239/239 [==============================] - 0s 918us/step - loss: 0.3578 - accuracy: 0.8593 - val_loss: 0.4209 - val_accuracy: 0.8356
Epoch 94/100
239/239 [==============================] - 0s 910us/step - loss: 0.3676 - accuracy: 0.8464 - val_loss: 0.4167 - val_accuracy: 0.8333
Epoch 95/100
239/239 [==============================] - 0s 979us/step - loss: 0.3639 - accuracy: 0.8545 - val_loss: 0.4162 - val_accuracy: 0.8367
Epoch 96/100
239/239 [==============================] - 0s 960us/step - loss: 0.3602 - accuracy: 0.8581 - val_loss: 0.4117 - val_accuracy: 0.8400
Epoch 97/100
239/239 [==============================] - 0s 955us/step - loss: 0.3588 - accuracy: 0.8539 - val_loss: 0.4203 - val_accuracy: 0.8378
Epoch 98/100
239/239 [==============================] - 0s 971us/step - loss: 0.3589 - accuracy: 0.8537 - val_loss: 0.4232 - val_accuracy: 0.8378
Epoch 99/100
239/239 [==============================] - 0s 972us/step - loss: 0.3647 - accuracy: 0.8509 - val_loss: 0.4251 - val_accuracy: 0.8345
Epoch 100/100
239/239 [==============================] - 0s 996us/step - loss: 0.3648 - accuracy: 0.8509 - val_loss: 0.4091 - val_accuracy: 0.8456
In [416]:
plt.plot(history3.history['accuracy'])
plt.plot(history3.history['val_accuracy'])
plt.title('Accuracy vs Epochs')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='lower right')
plt.show()
In [418]:
#Model 4

# Fixing the seed for random number generators
np.random.seed(42)

import random
random.seed(42)

tf.random.set_seed(42)




model_4 = Sequential()
model_4.add(Dense(units=12, input_dim=20, activation='relu')) 

model_4.add(Dense(64, activation='tanh', input_shape=(11,)))
model_4.add(Dropout(0.1))
model_4.add(Dense(32, activation='tanh'))
model_4.add(Dropout(0.1))
model_4.add(Dense(16, activation='tanh'))
model_4.add(Dense(1, activation='sigmoid'))


model_4.compile(loss = 'binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model_4.summary()
Model: "sequential_37"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_205 (Dense)           (None, 12)                252       
                                                                 
 dense_206 (Dense)           (None, 64)                832       
                                                                 
 dropout_49 (Dropout)        (None, 64)                0         
                                                                 
 dense_207 (Dense)           (None, 32)                2080      
                                                                 
 dropout_50 (Dropout)        (None, 32)                0         
                                                                 
 dense_208 (Dense)           (None, 16)                528       
                                                                 
 dense_209 (Dense)           (None, 1)                 17        
                                                                 
=================================================================
Total params: 3,709
Trainable params: 3,709
Non-trainable params: 0
_________________________________________________________________
In [419]:
#fitting the model
history4=model_4.fit(X_train,y_train,batch_size=15,epochs=100,validation_split=0.2)
Epoch 1/100
239/239 [==============================] - 1s 2ms/step - loss: 0.5086 - accuracy: 0.7602 - val_loss: 0.4936 - val_accuracy: 0.7707
Epoch 2/100
239/239 [==============================] - 0s 949us/step - loss: 0.4624 - accuracy: 0.7885 - val_loss: 0.4881 - val_accuracy: 0.7673
Epoch 3/100
239/239 [==============================] - 0s 942us/step - loss: 0.4513 - accuracy: 0.7955 - val_loss: 0.4780 - val_accuracy: 0.7785
Epoch 4/100
239/239 [==============================] - 0s 939us/step - loss: 0.4405 - accuracy: 0.8030 - val_loss: 0.4712 - val_accuracy: 0.7796
Epoch 5/100
239/239 [==============================] - 0s 929us/step - loss: 0.4294 - accuracy: 0.8083 - val_loss: 0.4678 - val_accuracy: 0.7852
Epoch 6/100
239/239 [==============================] - 0s 933us/step - loss: 0.4215 - accuracy: 0.8176 - val_loss: 0.4542 - val_accuracy: 0.7919
Epoch 7/100
239/239 [==============================] - 0s 954us/step - loss: 0.4157 - accuracy: 0.8215 - val_loss: 0.4535 - val_accuracy: 0.7908
Epoch 8/100
239/239 [==============================] - 0s 942us/step - loss: 0.4114 - accuracy: 0.8209 - val_loss: 0.4449 - val_accuracy: 0.8031
Epoch 9/100
239/239 [==============================] - 0s 978us/step - loss: 0.3996 - accuracy: 0.8310 - val_loss: 0.4456 - val_accuracy: 0.8031
Epoch 10/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3973 - accuracy: 0.8290 - val_loss: 0.4432 - val_accuracy: 0.8076
Epoch 11/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3912 - accuracy: 0.8369 - val_loss: 0.4362 - val_accuracy: 0.8110
Epoch 12/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3907 - accuracy: 0.8380 - val_loss: 0.4367 - val_accuracy: 0.8121
Epoch 13/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3856 - accuracy: 0.8369 - val_loss: 0.4329 - val_accuracy: 0.8098
Epoch 14/100
239/239 [==============================] - 0s 967us/step - loss: 0.3821 - accuracy: 0.8411 - val_loss: 0.4302 - val_accuracy: 0.8110
Epoch 15/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3796 - accuracy: 0.8411 - val_loss: 0.4340 - val_accuracy: 0.8065
Epoch 16/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3761 - accuracy: 0.8422 - val_loss: 0.4281 - val_accuracy: 0.8199
Epoch 17/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3731 - accuracy: 0.8472 - val_loss: 0.4238 - val_accuracy: 0.8132
Epoch 18/100
239/239 [==============================] - 0s 957us/step - loss: 0.3705 - accuracy: 0.8456 - val_loss: 0.4217 - val_accuracy: 0.8188
Epoch 19/100
239/239 [==============================] - 0s 967us/step - loss: 0.3698 - accuracy: 0.8478 - val_loss: 0.4253 - val_accuracy: 0.8210
Epoch 20/100
239/239 [==============================] - 0s 971us/step - loss: 0.3633 - accuracy: 0.8489 - val_loss: 0.4279 - val_accuracy: 0.8110
Epoch 21/100
239/239 [==============================] - 0s 954us/step - loss: 0.3658 - accuracy: 0.8444 - val_loss: 0.4316 - val_accuracy: 0.8188
Epoch 22/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3590 - accuracy: 0.8509 - val_loss: 0.4390 - val_accuracy: 0.8132
Epoch 23/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3642 - accuracy: 0.8481 - val_loss: 0.4218 - val_accuracy: 0.8210
Epoch 24/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3595 - accuracy: 0.8489 - val_loss: 0.4244 - val_accuracy: 0.8188
Epoch 25/100
239/239 [==============================] - 0s 939us/step - loss: 0.3590 - accuracy: 0.8489 - val_loss: 0.4221 - val_accuracy: 0.8210
Epoch 26/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3579 - accuracy: 0.8523 - val_loss: 0.4303 - val_accuracy: 0.8154
Epoch 27/100
239/239 [==============================] - 0s 993us/step - loss: 0.3557 - accuracy: 0.8489 - val_loss: 0.4245 - val_accuracy: 0.8188
Epoch 28/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3554 - accuracy: 0.8511 - val_loss: 0.4391 - val_accuracy: 0.8098
Epoch 29/100
239/239 [==============================] - 0s 989us/step - loss: 0.3558 - accuracy: 0.8506 - val_loss: 0.4308 - val_accuracy: 0.8154
Epoch 30/100
239/239 [==============================] - 0s 981us/step - loss: 0.3540 - accuracy: 0.8517 - val_loss: 0.4429 - val_accuracy: 0.8054
Epoch 31/100
239/239 [==============================] - 0s 978us/step - loss: 0.3553 - accuracy: 0.8517 - val_loss: 0.4311 - val_accuracy: 0.8110
Epoch 32/100
239/239 [==============================] - 0s 950us/step - loss: 0.3514 - accuracy: 0.8556 - val_loss: 0.4290 - val_accuracy: 0.8154
Epoch 33/100
239/239 [==============================] - 0s 961us/step - loss: 0.3489 - accuracy: 0.8534 - val_loss: 0.4442 - val_accuracy: 0.8143
Epoch 34/100
239/239 [==============================] - 0s 975us/step - loss: 0.3498 - accuracy: 0.8537 - val_loss: 0.4287 - val_accuracy: 0.8132
Epoch 35/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3466 - accuracy: 0.8576 - val_loss: 0.4365 - val_accuracy: 0.8177
Epoch 36/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3456 - accuracy: 0.8531 - val_loss: 0.4379 - val_accuracy: 0.8177
Epoch 37/100
239/239 [==============================] - 0s 949us/step - loss: 0.3458 - accuracy: 0.8573 - val_loss: 0.4325 - val_accuracy: 0.8076
Epoch 38/100
239/239 [==============================] - 0s 956us/step - loss: 0.3435 - accuracy: 0.8556 - val_loss: 0.4270 - val_accuracy: 0.8166
Epoch 39/100
239/239 [==============================] - 0s 962us/step - loss: 0.3432 - accuracy: 0.8556 - val_loss: 0.4435 - val_accuracy: 0.8188
Epoch 40/100
239/239 [==============================] - 0s 933us/step - loss: 0.3445 - accuracy: 0.8559 - val_loss: 0.4586 - val_accuracy: 0.8031
Epoch 41/100
239/239 [==============================] - 0s 941us/step - loss: 0.3422 - accuracy: 0.8537 - val_loss: 0.4468 - val_accuracy: 0.8020
Epoch 42/100
239/239 [==============================] - 0s 943us/step - loss: 0.3382 - accuracy: 0.8576 - val_loss: 0.4451 - val_accuracy: 0.8076
Epoch 43/100
239/239 [==============================] - 0s 938us/step - loss: 0.3363 - accuracy: 0.8579 - val_loss: 0.4459 - val_accuracy: 0.8087
Epoch 44/100
239/239 [==============================] - 0s 940us/step - loss: 0.3368 - accuracy: 0.8601 - val_loss: 0.4569 - val_accuracy: 0.8110
Epoch 45/100
239/239 [==============================] - 0s 944us/step - loss: 0.3350 - accuracy: 0.8581 - val_loss: 0.4476 - val_accuracy: 0.8076
Epoch 46/100
239/239 [==============================] - 0s 948us/step - loss: 0.3374 - accuracy: 0.8565 - val_loss: 0.4474 - val_accuracy: 0.8087
Epoch 47/100
239/239 [==============================] - 0s 983us/step - loss: 0.3339 - accuracy: 0.8579 - val_loss: 0.4539 - val_accuracy: 0.8087
Epoch 48/100
239/239 [==============================] - 0s 932us/step - loss: 0.3360 - accuracy: 0.8584 - val_loss: 0.4670 - val_accuracy: 0.8043
Epoch 49/100
239/239 [==============================] - 0s 955us/step - loss: 0.3349 - accuracy: 0.8581 - val_loss: 0.4480 - val_accuracy: 0.8087
Epoch 50/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3311 - accuracy: 0.8632 - val_loss: 0.4534 - val_accuracy: 0.8110
Epoch 51/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3305 - accuracy: 0.8601 - val_loss: 0.4535 - val_accuracy: 0.8065
Epoch 52/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3286 - accuracy: 0.8632 - val_loss: 0.4541 - val_accuracy: 0.8065
Epoch 53/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3306 - accuracy: 0.8595 - val_loss: 0.4475 - val_accuracy: 0.8143
Epoch 54/100
239/239 [==============================] - 0s 998us/step - loss: 0.3255 - accuracy: 0.8651 - val_loss: 0.4553 - val_accuracy: 0.8132
Epoch 55/100
239/239 [==============================] - 0s 979us/step - loss: 0.3317 - accuracy: 0.8618 - val_loss: 0.4484 - val_accuracy: 0.8132
Epoch 56/100
239/239 [==============================] - 0s 943us/step - loss: 0.3244 - accuracy: 0.8626 - val_loss: 0.4515 - val_accuracy: 0.8110
Epoch 57/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3245 - accuracy: 0.8629 - val_loss: 0.4565 - val_accuracy: 0.8132
Epoch 58/100
239/239 [==============================] - 0s 969us/step - loss: 0.3248 - accuracy: 0.8643 - val_loss: 0.4658 - val_accuracy: 0.8076
Epoch 59/100
239/239 [==============================] - 0s 955us/step - loss: 0.3206 - accuracy: 0.8671 - val_loss: 0.4594 - val_accuracy: 0.8098
Epoch 60/100
239/239 [==============================] - 0s 952us/step - loss: 0.3203 - accuracy: 0.8629 - val_loss: 0.4644 - val_accuracy: 0.8098
Epoch 61/100
239/239 [==============================] - 0s 949us/step - loss: 0.3181 - accuracy: 0.8637 - val_loss: 0.4725 - val_accuracy: 0.8121
Epoch 62/100
239/239 [==============================] - 0s 928us/step - loss: 0.3231 - accuracy: 0.8651 - val_loss: 0.4740 - val_accuracy: 0.8098
Epoch 63/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3172 - accuracy: 0.8699 - val_loss: 0.4689 - val_accuracy: 0.8020
Epoch 64/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3172 - accuracy: 0.8640 - val_loss: 0.4619 - val_accuracy: 0.8031
Epoch 65/100
239/239 [==============================] - 0s 937us/step - loss: 0.3191 - accuracy: 0.8651 - val_loss: 0.4673 - val_accuracy: 0.8076
Epoch 66/100
239/239 [==============================] - 0s 955us/step - loss: 0.3160 - accuracy: 0.8671 - val_loss: 0.4655 - val_accuracy: 0.8076
Epoch 67/100
239/239 [==============================] - 0s 931us/step - loss: 0.3153 - accuracy: 0.8651 - val_loss: 0.4723 - val_accuracy: 0.8065
Epoch 68/100
239/239 [==============================] - 0s 925us/step - loss: 0.3103 - accuracy: 0.8685 - val_loss: 0.4741 - val_accuracy: 0.7998
Epoch 69/100
239/239 [==============================] - 0s 935us/step - loss: 0.3135 - accuracy: 0.8660 - val_loss: 0.4712 - val_accuracy: 0.8098
Epoch 70/100
239/239 [==============================] - 0s 942us/step - loss: 0.3163 - accuracy: 0.8646 - val_loss: 0.4649 - val_accuracy: 0.8087
Epoch 71/100
239/239 [==============================] - 0s 938us/step - loss: 0.3129 - accuracy: 0.8651 - val_loss: 0.4722 - val_accuracy: 0.8087
Epoch 72/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3106 - accuracy: 0.8707 - val_loss: 0.4777 - val_accuracy: 0.8031
Epoch 73/100
239/239 [==============================] - 0s 956us/step - loss: 0.3105 - accuracy: 0.8674 - val_loss: 0.4720 - val_accuracy: 0.8054
Epoch 74/100
239/239 [==============================] - 0s 962us/step - loss: 0.3074 - accuracy: 0.8671 - val_loss: 0.4809 - val_accuracy: 0.8076
Epoch 75/100
239/239 [==============================] - 0s 932us/step - loss: 0.3123 - accuracy: 0.8665 - val_loss: 0.4761 - val_accuracy: 0.8065
Epoch 76/100
239/239 [==============================] - 0s 951us/step - loss: 0.3079 - accuracy: 0.8705 - val_loss: 0.4905 - val_accuracy: 0.8054
Epoch 77/100
239/239 [==============================] - 0s 947us/step - loss: 0.3082 - accuracy: 0.8721 - val_loss: 0.4730 - val_accuracy: 0.8076
Epoch 78/100
239/239 [==============================] - 0s 948us/step - loss: 0.3102 - accuracy: 0.8682 - val_loss: 0.4773 - val_accuracy: 0.8009
Epoch 79/100
239/239 [==============================] - 0s 953us/step - loss: 0.3056 - accuracy: 0.8693 - val_loss: 0.4936 - val_accuracy: 0.7931
Epoch 80/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3049 - accuracy: 0.8721 - val_loss: 0.4965 - val_accuracy: 0.7964
Epoch 81/100
239/239 [==============================] - 0s 956us/step - loss: 0.3074 - accuracy: 0.8727 - val_loss: 0.4861 - val_accuracy: 0.7964
Epoch 82/100
239/239 [==============================] - 0s 938us/step - loss: 0.3046 - accuracy: 0.8688 - val_loss: 0.4900 - val_accuracy: 0.8043
Epoch 83/100
239/239 [==============================] - 0s 974us/step - loss: 0.2976 - accuracy: 0.8724 - val_loss: 0.4923 - val_accuracy: 0.8009
Epoch 84/100
239/239 [==============================] - 0s 929us/step - loss: 0.2998 - accuracy: 0.8777 - val_loss: 0.4922 - val_accuracy: 0.7975
Epoch 85/100
239/239 [==============================] - 0s 954us/step - loss: 0.3012 - accuracy: 0.8688 - val_loss: 0.4848 - val_accuracy: 0.7998
Epoch 86/100
239/239 [==============================] - 0s 938us/step - loss: 0.3001 - accuracy: 0.8719 - val_loss: 0.4842 - val_accuracy: 0.8043
Epoch 87/100
239/239 [==============================] - 0s 944us/step - loss: 0.3002 - accuracy: 0.8724 - val_loss: 0.4910 - val_accuracy: 0.8043
Epoch 88/100
239/239 [==============================] - 0s 942us/step - loss: 0.3048 - accuracy: 0.8721 - val_loss: 0.4902 - val_accuracy: 0.8054
Epoch 89/100
239/239 [==============================] - 0s 946us/step - loss: 0.2985 - accuracy: 0.8710 - val_loss: 0.4898 - val_accuracy: 0.8043
Epoch 90/100
239/239 [==============================] - 0s 973us/step - loss: 0.2987 - accuracy: 0.8733 - val_loss: 0.5010 - val_accuracy: 0.8054
Epoch 91/100
239/239 [==============================] - 0s 948us/step - loss: 0.3028 - accuracy: 0.8685 - val_loss: 0.4929 - val_accuracy: 0.7964
Epoch 92/100
239/239 [==============================] - 0s 933us/step - loss: 0.2975 - accuracy: 0.8716 - val_loss: 0.4918 - val_accuracy: 0.7998
Epoch 93/100
239/239 [==============================] - 0s 940us/step - loss: 0.2970 - accuracy: 0.8707 - val_loss: 0.4964 - val_accuracy: 0.7975
Epoch 94/100
239/239 [==============================] - 0s 960us/step - loss: 0.2983 - accuracy: 0.8719 - val_loss: 0.5005 - val_accuracy: 0.8009
Epoch 95/100
239/239 [==============================] - 0s 930us/step - loss: 0.2947 - accuracy: 0.8699 - val_loss: 0.5022 - val_accuracy: 0.8065
Epoch 96/100
239/239 [==============================] - 0s 968us/step - loss: 0.2899 - accuracy: 0.8752 - val_loss: 0.4968 - val_accuracy: 0.8043
Epoch 97/100
239/239 [==============================] - 0s 933us/step - loss: 0.2938 - accuracy: 0.8724 - val_loss: 0.4924 - val_accuracy: 0.8110
Epoch 98/100
239/239 [==============================] - 0s 929us/step - loss: 0.2903 - accuracy: 0.8738 - val_loss: 0.4956 - val_accuracy: 0.7998
Epoch 99/100
239/239 [==============================] - 0s 947us/step - loss: 0.2911 - accuracy: 0.8749 - val_loss: 0.5221 - val_accuracy: 0.7875
Epoch 100/100
239/239 [==============================] - 0s 957us/step - loss: 0.2873 - accuracy: 0.8802 - val_loss: 0.5233 - val_accuracy: 0.8043
In [420]:
plt.plot(history4.history['accuracy'])
plt.plot(history4.history['val_accuracy'])
plt.title('Accuracy vs Epochs')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='lower right')
plt.show()
In [397]:
#Model #5


model_5 = Sequential()
model_5.add(Dense(units=32, input_dim=20, activation='relu')) 

model_5.add(Dense(256, activation='tanh', input_shape=(7,)))
model_5.add(Dropout(0.1))
model_5.add(Dense(128, activation='tanh'))
model_5.add(Dropout(0.1))
model_5.add(Dense(64, activation='tanh'))
model_5.add(Dropout(0.1))
model_5.add(Dense(32, activation='tanh'))
model_5.add(Dense(1, activation='sigmoid'))

model_5.compile(loss = 'binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model_5.summary()
Model: "sequential_30"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_154 (Dense)           (None, 32)                672       
                                                                 
 dense_155 (Dense)           (None, 256)               8448      
                                                                 
 dropout_39 (Dropout)        (None, 256)               0         
                                                                 
 dense_156 (Dense)           (None, 128)               32896     
                                                                 
 dropout_40 (Dropout)        (None, 128)               0         
                                                                 
 dense_157 (Dense)           (None, 64)                8256      
                                                                 
 dropout_41 (Dropout)        (None, 64)                0         
                                                                 
 dense_158 (Dense)           (None, 32)                2080      
                                                                 
 dense_159 (Dense)           (None, 1)                 33        
                                                                 
=================================================================
Total params: 52,385
Trainable params: 52,385
Non-trainable params: 0
_________________________________________________________________
In [398]:
#fitting the model
history5=model_5.fit(X_train,y_train,batch_size=15,epochs=100,validation_split=0.2)
Epoch 1/100
239/239 [==============================] - 1s 2ms/step - loss: 0.4872 - accuracy: 0.7753 - val_loss: 0.4845 - val_accuracy: 0.7819
Epoch 2/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4372 - accuracy: 0.8125 - val_loss: 0.4513 - val_accuracy: 0.8043
Epoch 3/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4107 - accuracy: 0.8251 - val_loss: 0.4710 - val_accuracy: 0.8098
Epoch 4/100
239/239 [==============================] - 0s 1ms/step - loss: 0.4008 - accuracy: 0.8304 - val_loss: 0.4361 - val_accuracy: 0.8076
Epoch 5/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3857 - accuracy: 0.8422 - val_loss: 0.4409 - val_accuracy: 0.8154
Epoch 6/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3810 - accuracy: 0.8380 - val_loss: 0.4600 - val_accuracy: 0.8076
Epoch 7/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3741 - accuracy: 0.8433 - val_loss: 0.4432 - val_accuracy: 0.8065
Epoch 8/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3696 - accuracy: 0.8511 - val_loss: 0.4361 - val_accuracy: 0.8199
Epoch 9/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3656 - accuracy: 0.8447 - val_loss: 0.4310 - val_accuracy: 0.8289
Epoch 10/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3559 - accuracy: 0.8470 - val_loss: 0.4620 - val_accuracy: 0.8098
Epoch 11/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3565 - accuracy: 0.8539 - val_loss: 0.4641 - val_accuracy: 0.8143
Epoch 12/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3559 - accuracy: 0.8470 - val_loss: 0.4459 - val_accuracy: 0.8121
Epoch 13/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3435 - accuracy: 0.8553 - val_loss: 0.4605 - val_accuracy: 0.8199
Epoch 14/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3412 - accuracy: 0.8598 - val_loss: 0.4477 - val_accuracy: 0.8177
Epoch 15/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3386 - accuracy: 0.8567 - val_loss: 0.4460 - val_accuracy: 0.8132
Epoch 16/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3260 - accuracy: 0.8640 - val_loss: 0.4513 - val_accuracy: 0.8255
Epoch 17/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3297 - accuracy: 0.8607 - val_loss: 0.4498 - val_accuracy: 0.8289
Epoch 18/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3221 - accuracy: 0.8649 - val_loss: 0.4686 - val_accuracy: 0.8043
Epoch 19/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3192 - accuracy: 0.8626 - val_loss: 0.4816 - val_accuracy: 0.8154
Epoch 20/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3142 - accuracy: 0.8674 - val_loss: 0.4705 - val_accuracy: 0.8110
Epoch 21/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3079 - accuracy: 0.8730 - val_loss: 0.4736 - val_accuracy: 0.8221
Epoch 22/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3026 - accuracy: 0.8702 - val_loss: 0.4872 - val_accuracy: 0.8221
Epoch 23/100
239/239 [==============================] - 0s 1ms/step - loss: 0.3047 - accuracy: 0.8744 - val_loss: 0.4958 - val_accuracy: 0.8031
Epoch 24/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2992 - accuracy: 0.8696 - val_loss: 0.4693 - val_accuracy: 0.7931
Epoch 25/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2938 - accuracy: 0.8800 - val_loss: 0.5061 - val_accuracy: 0.7942
Epoch 26/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2897 - accuracy: 0.8763 - val_loss: 0.4949 - val_accuracy: 0.8065
Epoch 27/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2824 - accuracy: 0.8772 - val_loss: 0.5054 - val_accuracy: 0.7975
Epoch 28/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2826 - accuracy: 0.8786 - val_loss: 0.5229 - val_accuracy: 0.7987
Epoch 29/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2708 - accuracy: 0.8842 - val_loss: 0.5268 - val_accuracy: 0.7864
Epoch 30/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2752 - accuracy: 0.8839 - val_loss: 0.5209 - val_accuracy: 0.7931
Epoch 31/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2685 - accuracy: 0.8822 - val_loss: 0.5255 - val_accuracy: 0.8031
Epoch 32/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2622 - accuracy: 0.8867 - val_loss: 0.5365 - val_accuracy: 0.8043
Epoch 33/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2542 - accuracy: 0.8898 - val_loss: 0.5419 - val_accuracy: 0.8098
Epoch 34/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2591 - accuracy: 0.8864 - val_loss: 0.5185 - val_accuracy: 0.8031
Epoch 35/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2526 - accuracy: 0.8917 - val_loss: 0.5460 - val_accuracy: 0.8110
Epoch 36/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2496 - accuracy: 0.8940 - val_loss: 0.5485 - val_accuracy: 0.7987
Epoch 37/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2378 - accuracy: 0.8998 - val_loss: 0.5518 - val_accuracy: 0.8043
Epoch 38/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2318 - accuracy: 0.8979 - val_loss: 0.5711 - val_accuracy: 0.7830
Epoch 39/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2360 - accuracy: 0.8940 - val_loss: 0.6045 - val_accuracy: 0.7841
Epoch 40/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2294 - accuracy: 0.9018 - val_loss: 0.5874 - val_accuracy: 0.7897
Epoch 41/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2238 - accuracy: 0.8993 - val_loss: 0.5898 - val_accuracy: 0.7864
Epoch 42/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2151 - accuracy: 0.9068 - val_loss: 0.5992 - val_accuracy: 0.8020
Epoch 43/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2114 - accuracy: 0.9082 - val_loss: 0.6198 - val_accuracy: 0.7718
Epoch 44/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2078 - accuracy: 0.9102 - val_loss: 0.6405 - val_accuracy: 0.8076
Epoch 45/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2081 - accuracy: 0.9135 - val_loss: 0.5964 - val_accuracy: 0.7987
Epoch 46/100
239/239 [==============================] - 0s 1ms/step - loss: 0.2032 - accuracy: 0.9102 - val_loss: 0.6645 - val_accuracy: 0.7864
Epoch 47/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1969 - accuracy: 0.9155 - val_loss: 0.6579 - val_accuracy: 0.7830
Epoch 48/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1944 - accuracy: 0.9194 - val_loss: 0.6365 - val_accuracy: 0.7707
Epoch 49/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1966 - accuracy: 0.9172 - val_loss: 0.6494 - val_accuracy: 0.7975
Epoch 50/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1975 - accuracy: 0.9141 - val_loss: 0.6513 - val_accuracy: 0.7852
Epoch 51/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1933 - accuracy: 0.9203 - val_loss: 0.6558 - val_accuracy: 0.7931
Epoch 52/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1852 - accuracy: 0.9194 - val_loss: 0.6768 - val_accuracy: 0.8009
Epoch 53/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1812 - accuracy: 0.9175 - val_loss: 0.6692 - val_accuracy: 0.7964
Epoch 54/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1721 - accuracy: 0.9242 - val_loss: 0.7161 - val_accuracy: 0.7852
Epoch 55/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1793 - accuracy: 0.9194 - val_loss: 0.6980 - val_accuracy: 0.7964
Epoch 56/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1676 - accuracy: 0.9287 - val_loss: 0.6916 - val_accuracy: 0.7808
Epoch 57/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1743 - accuracy: 0.9264 - val_loss: 0.7144 - val_accuracy: 0.7796
Epoch 58/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1725 - accuracy: 0.9219 - val_loss: 0.7044 - val_accuracy: 0.7707
Epoch 59/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1721 - accuracy: 0.9261 - val_loss: 0.7444 - val_accuracy: 0.7796
Epoch 60/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1552 - accuracy: 0.9317 - val_loss: 0.7429 - val_accuracy: 0.7852
Epoch 61/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1607 - accuracy: 0.9323 - val_loss: 0.7276 - val_accuracy: 0.7908
Epoch 62/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1518 - accuracy: 0.9365 - val_loss: 0.7630 - val_accuracy: 0.7651
Epoch 63/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1645 - accuracy: 0.9309 - val_loss: 0.7668 - val_accuracy: 0.7718
Epoch 64/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1538 - accuracy: 0.9362 - val_loss: 0.7580 - val_accuracy: 0.7897
Epoch 65/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1541 - accuracy: 0.9382 - val_loss: 0.7656 - val_accuracy: 0.7785
Epoch 66/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1490 - accuracy: 0.9382 - val_loss: 0.7800 - val_accuracy: 0.7774
Epoch 67/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1359 - accuracy: 0.9426 - val_loss: 0.8168 - val_accuracy: 0.7875
Epoch 68/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1381 - accuracy: 0.9432 - val_loss: 0.8380 - val_accuracy: 0.7651
Epoch 69/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1503 - accuracy: 0.9334 - val_loss: 0.8044 - val_accuracy: 0.7830
Epoch 70/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1336 - accuracy: 0.9468 - val_loss: 0.8201 - val_accuracy: 0.7864
Epoch 71/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1246 - accuracy: 0.9491 - val_loss: 0.7896 - val_accuracy: 0.7796
Epoch 72/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1366 - accuracy: 0.9407 - val_loss: 0.8125 - val_accuracy: 0.7864
Epoch 73/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1286 - accuracy: 0.9527 - val_loss: 0.8357 - val_accuracy: 0.7752
Epoch 74/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1249 - accuracy: 0.9510 - val_loss: 0.8471 - val_accuracy: 0.7752
Epoch 75/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1339 - accuracy: 0.9460 - val_loss: 0.8446 - val_accuracy: 0.7830
Epoch 76/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1223 - accuracy: 0.9510 - val_loss: 0.9223 - val_accuracy: 0.7707
Epoch 77/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1400 - accuracy: 0.9438 - val_loss: 0.8864 - val_accuracy: 0.7796
Epoch 78/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1335 - accuracy: 0.9454 - val_loss: 0.8425 - val_accuracy: 0.7763
Epoch 79/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1272 - accuracy: 0.9491 - val_loss: 0.8826 - val_accuracy: 0.7830
Epoch 80/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1227 - accuracy: 0.9524 - val_loss: 0.8839 - val_accuracy: 0.7617
Epoch 81/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1254 - accuracy: 0.9499 - val_loss: 0.8954 - val_accuracy: 0.7696
Epoch 82/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1077 - accuracy: 0.9580 - val_loss: 0.8919 - val_accuracy: 0.7841
Epoch 83/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1156 - accuracy: 0.9505 - val_loss: 0.8582 - val_accuracy: 0.7763
Epoch 84/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1148 - accuracy: 0.9544 - val_loss: 0.9057 - val_accuracy: 0.7673
Epoch 85/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1080 - accuracy: 0.9605 - val_loss: 0.9047 - val_accuracy: 0.7662
Epoch 86/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1077 - accuracy: 0.9575 - val_loss: 0.9070 - val_accuracy: 0.7864
Epoch 87/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1142 - accuracy: 0.9544 - val_loss: 0.9235 - val_accuracy: 0.7763
Epoch 88/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1045 - accuracy: 0.9572 - val_loss: 0.9416 - val_accuracy: 0.7651
Epoch 89/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1194 - accuracy: 0.9516 - val_loss: 0.9144 - val_accuracy: 0.7673
Epoch 90/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1074 - accuracy: 0.9558 - val_loss: 0.9050 - val_accuracy: 0.7796
Epoch 91/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1037 - accuracy: 0.9591 - val_loss: 0.9065 - val_accuracy: 0.7606
Epoch 92/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1054 - accuracy: 0.9597 - val_loss: 0.9297 - val_accuracy: 0.7707
Epoch 93/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1150 - accuracy: 0.9572 - val_loss: 0.9128 - val_accuracy: 0.7707
Epoch 94/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1014 - accuracy: 0.9591 - val_loss: 0.9375 - val_accuracy: 0.7908
Epoch 95/100
239/239 [==============================] - 0s 1ms/step - loss: 0.0988 - accuracy: 0.9633 - val_loss: 0.9347 - val_accuracy: 0.7763
Epoch 96/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1031 - accuracy: 0.9583 - val_loss: 0.9375 - val_accuracy: 0.7718
Epoch 97/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1014 - accuracy: 0.9580 - val_loss: 0.9682 - val_accuracy: 0.7808
Epoch 98/100
239/239 [==============================] - 0s 1ms/step - loss: 0.0940 - accuracy: 0.9622 - val_loss: 0.9857 - val_accuracy: 0.7763
Epoch 99/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1081 - accuracy: 0.9575 - val_loss: 1.0043 - val_accuracy: 0.7729
Epoch 100/100
239/239 [==============================] - 0s 1ms/step - loss: 0.1163 - accuracy: 0.9524 - val_loss: 0.9317 - val_accuracy: 0.7796
In [399]:
plt.plot(history5.history['accuracy'])
plt.plot(history5.history['val_accuracy'])
plt.title('Accuracy vs Epochs')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='lower right')
plt.show()
In [422]:
model_3.evaluate(X_test, y_test, verbose = 1)
test_pred = np.round(model_3.predict(X_test))
60/60 [==============================] - 0s 668us/step - loss: 0.4400 - accuracy: 0.8209
60/60 [==============================] - 0s 528us/step
In [423]:
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix

print(classification_report(y_test, test_pred))
cm = confusion_matrix(y_test, test_pred)
plt.figure(figsize=(8,5))
sns.heatmap(cm, annot=True,  fmt='.0f',xticklabels=['Not Exited', 'Exited'], yticklabels=['Not Exited', 'Exited'])
plt.ylabel('Actual')
plt.xlabel('Predicted')
plt.show()
              precision    recall  f1-score   support

           0       0.84      0.95      0.89      1439
           1       0.73      0.44      0.55       476

    accuracy                           0.82      1915
   macro avg       0.79      0.69      0.72      1915
weighted avg       0.81      0.82      0.80      1915

Observations¶

Model 3 seems to preform the best

I have to keep the number of neuron down, because I noticed when I increased them it was causing inacuracies between the training and validation datasets

I also noticed the more hidden layers that were added the less the model learned, so I kept the layers low for model 3

In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [79]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:

In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]: